1.使用开源的openJDK,和商用的oracleJDK在性能、功能和执行逻辑上基本一致
2.JDK中使用的jvm是HotSpot,项目结构见《深入理解java虚拟机:jvm高级特性与最佳实践 》 P34
3.JVM内存模型:程序计数器、本地方法栈、虚拟栈区、方法区、堆。P39
程序计数器:较小内存区,当前线程所执行的字节码的行号指示器。字节码解释器工作时就是通过改变计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能需要依赖计数器完成
虚拟机栈:线程私有,生命周期和线程相同,描述的是Java方法执行的内存模型。每个方法在执行的同时都会创建一个栈帧用来存储局部变量、操作数栈、动态链接、方法出口等信息。每一个方法从调用直至执行完成的过程,就对应这一个栈帧在虚拟机栈中入栈到出栈的过程;虚拟机栈中局部变量表中存放着各种基本数据类型、对象引用(非对象,指针或句柄),和returnAddress类型(指向了一条字节码指令的地址)
本地方法栈:与虚拟机栈相似,虚拟机栈为虚拟机执行Java方法(字节码)服务,本地方法栈则为虚拟机使用的native方法服务。sun HotSpot直接把本地方法栈和虚拟机栈合二为一。
Java堆:虚拟机所管理的内存中最大的一块,被所有线程共享的一块内存区域,虚拟机启动时创建,唯一的目的就是存放对象实例。GC的主要管理区域,也被称为GC堆。细分为新生代和老年代
方法区:线程共享的内存区域,存储虚拟机加载的类信息、常量、静态变量等数据。Java虚拟机规范把方法区描述为堆的一个逻辑部分
4.GC的依据(非GC实现算法):通过可达性分析(Reachability Analysis)来判断对象是否存活。该算法通过一系列成为“GC root”的对象作为起点,从这些节点开始向下搜索,搜索走过的路径成为引用链,当一个对象到GC root没有任何引用链相连时(图论:从GCroot到这个对象不可达),则证明此对象不可用。
5.Java引用:强、软、弱、虚四种引用。
6.finalize():在可达性分析算法中不可达的对象,并非“非死不可”,至少经过两次标记过程。如果对象没有与GC ROOT相连接的引用,那么被标记并进行第一次筛选,筛选条件是此对象是否有必要执行finalize()方法,对象没有覆盖finalize或finalize已经被虚拟机调用过,虚拟机将这两种情况视为“没有必要执行”。
如果有必要执行finalize(),该对象将被放入队列中执行finalize(),如果对象在finalize()中拯救了自己-——只要重新与引用链上的一个对象建立关联即可。那么在第二次标记时将被移出“即将回收”的集合。如果没有逃脱,还会被回收。
7.GC算法:标记-清除算法:最基础的收集算法,效率低,产生大量不连续的内存碎片。
复制算法:实现简单,运行高效,空间代价大。商用虚拟机采用回收新生代
标记-整理算法:老年代采用。
分代收集算法:分别采用复制算法和标记-*算法
2.JDK中使用的jvm是HotSpot,项目结构见《深入理解java虚拟机:jvm高级特性与最佳实践 》 P34
3.JVM内存模型:程序计数器、本地方法栈、虚拟栈区、方法区、堆。P39
程序计数器:较小内存区,当前线程所执行的字节码的行号指示器。字节码解释器工作时就是通过改变计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能需要依赖计数器完成
虚拟机栈:线程私有,生命周期和线程相同,描述的是Java方法执行的内存模型。每个方法在执行的同时都会创建一个栈帧用来存储局部变量、操作数栈、动态链接、方法出口等信息。每一个方法从调用直至执行完成的过程,就对应这一个栈帧在虚拟机栈中入栈到出栈的过程;虚拟机栈中局部变量表中存放着各种基本数据类型、对象引用(非对象,指针或句柄),和returnAddress类型(指向了一条字节码指令的地址)
本地方法栈:与虚拟机栈相似,虚拟机栈为虚拟机执行Java方法(字节码)服务,本地方法栈则为虚拟机使用的native方法服务。sun HotSpot直接把本地方法栈和虚拟机栈合二为一。
Java堆:虚拟机所管理的内存中最大的一块,被所有线程共享的一块内存区域,虚拟机启动时创建,唯一的目的就是存放对象实例。GC的主要管理区域,也被称为GC堆。细分为新生代和老年代
方法区:线程共享的内存区域,存储虚拟机加载的类信息、常量、静态变量等数据。Java虚拟机规范把方法区描述为堆的一个逻辑部分
4.GC的依据(非GC实现算法):通过可达性分析(Reachability Analysis)来判断对象是否存活。该算法通过一系列成为“GC root”的对象作为起点,从这些节点开始向下搜索,搜索走过的路径成为引用链,当一个对象到GC root没有任何引用链相连时(图论:从GCroot到这个对象不可达),则证明此对象不可用。
5.Java引用:强、软、弱、虚四种引用。
6.finalize():在可达性分析算法中不可达的对象,并非“非死不可”,至少经过两次标记过程。如果对象没有与GC ROOT相连接的引用,那么被标记并进行第一次筛选,筛选条件是此对象是否有必要执行finalize()方法,对象没有覆盖finalize或finalize已经被虚拟机调用过,虚拟机将这两种情况视为“没有必要执行”。
如果有必要执行finalize(),该对象将被放入队列中执行finalize(),如果对象在finalize()中拯救了自己-——只要重新与引用链上的一个对象建立关联即可。那么在第二次标记时将被移出“即将回收”的集合。如果没有逃脱,还会被回收。
7.GC算法:标记-清除算法:最基础的收集算法,效率低,产生大量不连续的内存碎片。
复制算法:实现简单,运行高效,空间代价大。商用虚拟机采用回收新生代
标记-整理算法:老年代采用。
分代收集算法:分别采用复制算法和标记-*算法