当前位置: 首页 > 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:

http://www.dtcms.com/a/5382.html

相关文章:

  • 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多场景应用,让汽车总线测试更简单
  • JS对象笔记
  • Java八股文面试全套真题【含答案】- Redis篇
  • 迎接更高效的数据安全合规与风险评估,美创科技DCAS正式商用发布!
  • 一个简单的cmake模板(C++)
  • pytorch中的transpose用法
  • HDPE硅芯管强度高,抗压抗张和抗冲击强,外层不需其它套管
  • NFS远程文件共享系统!
  • k8s-learning-why we need pod
  • 学习git后,真正在项目中如何使用?
  • 李宏毅bert记录