对象的创建
虚拟机遇到new的时候,1 检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并检查这个符号引用代表的类是否已被加载,解析,初始化,
2类加载检查通过后,虚拟机将为新生对象分配内存,这里可以了解一下指针碰撞,空闲列表,同步处理分配,本地线程分配缓冲分配空间。
3 内存分配完成后,虚拟机要将分配到的内存空间都初始化为零值。
4 虚拟机对对象进行信息设置:对象是哪个类的实例,如何找到类的元数据信息,对象的哈希码,对象的gc分代年龄等信息。这些信息存放在对象的对象头中。
5 init方法还没执行,把对象按照程序员的意愿进行初始化。 这样一个真正可以用的对象才算完全产生出来。
对象内存布局
3快:对象头,实例数据,对齐填充。
对象头两部分,1 存储对象自身的运行时数据,如哈希码,gc分代年龄,锁状态标志等,官方称为mark word。
2 类型指针,即对象指向它的元数据的指针。jvm通过这个指针来确定这个对象 是哪个类的实例。注意:查找查找对象元数据信息并不一定要通过对象本身。
实例数据: 对象真正存储的有效信息,无论从父类继承下来的还是子类中定义的,都会记录下来。
对齐填充: 对象实例数据部分没有对齐的时候,需要通过对齐填充来补全,必须是8字节的整数倍。
对象的访问定位 ,对象的访问方式是由jvm实现,决定的。流行的两种:句柄访问,直接指针。一个句柄池一个没有,句柄池中会存放对象实例数据与类型数据各自的具 体地址信息 。
使用句柄访问的好处是reference中存储的是稳定的句柄地址,对象被移动回收的时候,不会影响reference。不实用的好处就是速度更快,节省了一次定位时间。
OOM
java堆溢出,程序+设置参数
-Xms60m
-Xmx60m
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/Users/shenshaonian/Desktop/dumptest
/Users/admin/Downloads/mat.app/Contents/MacOS/MemoryAnalyzer -data ./workspace
启动mat /Applications/mat.app/Contents/MacOS/MemoryAnalyzer -data ./workspace
mat分析dump文件
原文:https://www.cnblogs.com/woainixxx/p/12983615.html