object(8字节的整数倍)
-
markword(8字节)
- GC信息:存的的年龄
- identity hashCode
- 锁信息:
-
类指针:classProinter(4字节)
1.useCompressClassPointers: 压缩类指针(8->4),内存超32G,失效
2.记录当前对象属于的 .class 文件 -
属性:(存的是对应的指针信息)
- userCompressOops:(ordinary object pointers)压缩指针(8->4)
-
对齐字段:
Q1:为什么hotspot不使用C++对象代表JAVA对象?
A1:java中存在 oop-klass 二元机制,创建对象时,会同时生成 oopDescription 的C++对象(有一个virtual table 指针指向虚方法表,用于实现多态) 和 唯一对象.class(instanceClass)(存的虚方法表);避免每次创建虚方法表,浪费空间。
Q2:class 对象在那个区(方法区?堆?)
A2:方法区;(元空间,)。hotspot:创建的对象在堆区,但在方法区存在一个oopD 的C++对象在方法区(会出现OOM),指向堆区的 instanceClass 对象(反射)
锁的升级
无锁:
偏向锁:涉及锁撤销,会一定程度消耗资源,JVM 启动会出现多线程竞争,默认启动时延4秒(但不偏向线程(匿名偏向));关闭偏向锁;(开启:-xxBaiseLockingStartupDelay=?秒 wait()---->重量级锁
轻量级锁:线程未获取锁,就做简单自旋,等待获取锁,由JVM管理自旋次数。
重量级锁:自己维护等待队列,存放想获取锁的进程,避免长时间自旋,且不消耗CPU资源。