当前位置: 首页 > news >正文

JVM之堆学习

一、Java虚拟机内存结构图

二、堆的介绍

1. 前面学习的程序计数器,虚拟机栈和本地方法栈都是线程私有的,堆是线程共享的;

2. 通过 new 关键字,创建的对象都会使用堆内存,其特点是:

  • 它是线程共享的,堆中对象都需要考虑线程安全的问题(虚拟机栈中的局部变量只要不逃离方法的作用范围就是线程安全的
  • 有垃圾回收机制

三、一些示例

3.1 堆内存溢出

1. 代码示例

package cn.itcast.jvm.t1.heap;

import java.util.ArrayList;
import java.util.List;

/**
 * 演示堆内存溢出 java.lang.OutOfMemoryError: Java heap space
 * -Xmx8m
 */
public class Demo1_5 {

    public static void main(String[] args) {
        int i = 0;
        try {
            List<String> list = new ArrayList<>();
            String a = "hahaha";
            while (true) {
                list.add(a); // hahaha, hahahahahaha, hahahahahahahahaha...
                a = a + a;
                i++;
            }
        } catch (Throwable e) {
            e.printStackTrace();
            System.out.println(i);
        }
    }
}

2. 报错信息 

3. 修改堆内存大小

 修改了堆内存大小后再次运行程序:

 

3.2 堆内存诊断工具

jps: 首先通过jps工具查看当前系统中有哪些Java进程

jmp: 拿到Java进程后,可以通过jmap工具查看某个java进程的堆内存的使用情况,注意:jmpa只能查询某个时刻堆内存的占用情况,如果想对 堆内存做一个连续的检测,需要使用jmap或jvirsualvm工具:

jconsole: 

jvirsualvm:

相关文章:

  • IoTDB服务安装教程-单机版
  • mysql比较varchar值大小_Mysql varchar大小长度问题
  • 阿里云RDS MySQL 数据如何快速同步到 ClickHouse
  • 【解决】maven管理工具使用package打包的时候无法将lib文件夹下的第三方jar包打入,上线打jar包后运行异常问题...
  • layui日历插件
  • 回溯算法第三篇(批处理作业调度、N皇后【基于排列树实现】、符号三角形问题)
  • 实战章节:在Linux上部署各类软件
  • SpringBoot的Starter自动化配置,自己编写配置maven依赖且使用及短信发送案例
  • XUbuntu22.04之8款免费UML工具(一百九十七)
  • 大一C语言作业 12.14
  • 智能优化算法应用:基于旗鱼算法3D无线传感器网络(WSN)覆盖优化 - 附代码
  • easypoi 导出excel设置标题样式
  • Altair Radioss碰撞 安全与冲击 衡祖仿真
  • 鸿蒙应用开发(二)环境搭建
  • Java程序员,你掌握了多线程吗?
  • 第五节JavaScript typeof、类型转换与正则表达式
  • 解决POI导入内部错误方式
  • 实验01:静态路由配置实验
  • 最前端|Locofy试用报告:设计稿直接转换为代码
  • CanEasy多场景应用,让汽车总线测试更简单
  • 19个剧团15台演出,上海民营院团尝试文旅融合新探索
  • 2025中国南昌国际龙舟赛5月23日启幕,是历年来南昌举办的最高规格龙舟赛事
  • 首批证券公司科创债来了!拟发行规模超160亿元
  • 山寨“小米”智能马桶、花洒销售额过亿,被判赔3500万元
  • 纪念苏联伟大卫国战争胜利80周年阅兵彩排,解放军仪仗队亮相
  • 秦洪看盘|受阻回落,蓄积新做多能量