[原创] JVM学习笔记

  1. 运行时的数据区域  程序计数器 线程私有,记录线程的执行虚拟机字节码指令的地址  Java虚拟机栈 线程私有,方法的调用对应一个栈帧的出入。  栈帧 1) 操作数栈 2) 局部变量表 3) 动态链接 4) 方法返回地址  本地方法栈

 Java堆

 方法区 1) 运行时的常量池

  1. jvm判断对象“死去”

 引用计数法 没添加一个引用,计数器+1,失去一个引用,计数器-1. 缺点:无法解决对象相互引用的情况  可达算法(根搜索) 一个对象到根节点没有引用链,则该对象是不可用的。  引用链:根节点到某个对象的路径称为该对象的引用链

引用链

  1. jvm中引用对象的方式  java虚拟机栈中栈帧中的局部变量表中的变量指向句柄池中的地址。该句柄含有对象在堆中的实例地址和对象类型数据的指针

 栈帧中局部变量表的变量直接指向对象,由对象中的一小块地址指向对象类型数据

  1. java的四种引用  强引用 例如代码中 Object a = new Object()类型,只要强引用存在,对象不会被回收  软引用 软引用对象可以存活到内存溢出之前。  弱引用 存活到下次GC  虚引用 无法用虚引用获取对象实例,虚引用为了在对象回收的时候给系统一个通知
  2. 垃圾回收算法  标记-清除法 标记需要清楚的对象,然后统一回收对象。 缺点:空间碎片,提前触发GC

 复制算法 分区后,将存活的对象拷贝至没被使用的区

 标记-整理法 标记需要清楚的对象,然后将存活的对象整理至一段,直接清除边界意外的数据

  1. 分代  年轻代(minor GC | Yong GC) 年轻代分为Eden ,from,to 三个区域。New一个对象时,会将对象存放在Eden区,每次GC都会将对象拷贝至 from 或to区,直到GC次数达到阈值,对象被放入老年代  老年代(major GC | full GC) 标记整理法  永久代