对象的创建

虚拟机遇到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文件