jVisualVM不仅可以查看转储文件,也可以实事监控程序的运行状态(远程或本地都可以)。
关于Java对象创建的过程:
new对象创建对象的3个步骤:
- 在堆内存中创建出对象的实例。
- 为对象的成员变量赋初值。
- 将对象的引用返回。
两种对象的存储方式(在堆内存中创建出对象的实例):
-
指针碰撞:(前提是堆中的空间通过一个指针进行分割,一侧是已被占用的空间,另一侧是未被占用的空间):
-
空闲列表:(前提是堆内存空间中已被使用与未被使用的空间是交织在一起的,这时虚拟机就需要通过一个列表来记录哪些空间是可以使用的,哪些是已经被使用的,记下来找出可以容纳下新创建对象的且未被使用的空间,在此空间存放该对象,同时还要修改列表上的记录。)
对象在内存中的布局:
1 . 对象头
2 . 实例数据(即我们在一个类中所生命的各项信息)
3 . 对齐填充(可选)
引用访问对象的方式:
- 使用句柄的方式。
- 使用直接指针的方式。
内存溢出错误排查:
一般不会遇到,遇到就是大问题。
- idea设置jvm启动参数(堆内存最小为5m,最大也为5m):
-Xms5m -Xmx5m -XX:+HeapDumpOnOutOfMemoryError
程序内存溢出报错:
- 生成的堆内存转储文件
- 用jvisualvm打开此文件
- jvisualvm 分析堆转储文件
①概要
这个文件的基本信息
②类
说明此堆转储中,myTest1这个类占用了堆内存的90以上。
③ 双击类名查看其实例数 (十六万多个)