JVM

09
Apr
JVM的类加载
生命周期一个类型从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期将会经历加载 (Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化 (Initialization)、使用(Using)和卸载(Unloading)七个阶段,其中验证、准备、解析三个部分统称为连接(Linking)。类加载加载通过一个类的全限定名来获取定义此类的二进制字节流。将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口(反射机...
51
2020/04/09
07
Apr
关于JVM Safepoint(安全点)的理解
首先从垃圾回收说起,当发生GC时,需要从方法区或本地变量表等地方获取GC Roots,但如果是单纯的遍历查找的话是非常亏的,GC发生时本身就停止了所有的线程,不能让这一操作耗费太多的时间。HotSpot为优化GC Roots的查找,采用了OopMap这一数据结构,一旦类加载动作完成的时候,HotSpot就会把对象内什么偏移量上是什么类型的数据计算出来,在即时编译过程中,也会在特定的位置记录下栈里和寄存器里哪些位置是引用。通过OopMap,JVM可以快速枚举出GC Roots,但是对象引用随时都在变,如何维护OopMap又是一个问题。HotSpot的做法就是设置Safepoint。在一个方...
55
2020/04/07
04
Apr
当Java对象处在偏向锁、轻量锁、重量级锁状态时,Mark Word值存储在哪?
参考当Java处在偏向锁、重量级锁状态时,hashcode值存储在哪?由上图可以看出来,HotSpot VM 为了优化空间,复用了对象头的一部分空间,不免产生一个疑问:当对象头处于锁定状态时,其对象哈希码、分代年龄、偏向模式等数据又存放在哪里了呢?偏向锁当一个对象已经计算过identity hash code,它就无法进入偏向锁状态当一个对象当前正处于偏向锁状态,并且需要计算其identity hash code的话,则它的偏向锁会被撤销,并且锁会膨胀为重量锁在偏向锁中,哈希码和线程ID复用同一块空间,HotSpot VM是以实际上只有很少对象会计算identity hash code为...
99
2020/04/04