diff --git a/notes/Java_虚拟机.md b/notes/Java_虚拟机.md index 5630eec..4d1fdfa 100644 --- a/notes/Java_虚拟机.md +++ b/notes/Java_虚拟机.md @@ -51,7 +51,7 @@ 在 2017 年 JDK 9 发布后,Oracle 公司宣布从此以后 JDK 将会在每年的 3 月和 9 月各发布一个大版本,即半年发行一个大版本,目的是为了避免众多功能被捆绑到一个 JDK 版本上而引发的无法交付的风险。 - 在 JDK 11 发布后,Oracle 同时调整了 JDK 的商业授权,宣布从 JDK 11 起将以前的商业特性全部开源给 OpenJDK ,这样 OpenJDK 11 和 OracleJDK 11 的代码和功能,在本质上就是完全相同的。同时 Oracle 还宣布以后都会发行两个版本的 JDK : + 在 JDK 11 发布后,Oracle 调整了 JDK 的商业授权,宣布从 JDK 11 起将以前的商业特性全部开源给 OpenJDK ,这样 OpenJDK 11 和 OracleJDK 11 的代码和功能,在本质上就是完全相同的。同时 Oracle 还宣布以后都会发行两个版本的 JDK : + 一个是在 GPLv2 + CE 协议下由 Oracle 开源的 OpenJDK; + 一个是在 OTN 协议下正常发行的 OracleJDK。 @@ -249,8 +249,8 @@ System.gc(); 当前大多数虚拟机都遵循 “分代收集” 的理论进行设计,它建立在强弱两个分代假说下: -+ **弱分代假说 (Weak Generational Hypothesis) **:绝大多数对象都是朝生夕灭的。 -+ **强分代假说 (Strong Generational Hypothesis) **:熬过越多次垃圾收集过程的对象就越难以消亡。 ++ **弱分代假说 (Weak Generational Hypothesis)**:绝大多数对象都是朝生夕灭的。 ++ **强分代假说 (Strong Generational Hypothesis)**:熬过越多次垃圾收集过程的对象就越难以消亡。 + **跨带引用假说 (Intergenerational Reference Hypothesis)**:基于上面两条假说还可以得出的一条隐含推论:存在相互引用关系的两个对象,应该倾向于同时生存或者同时消亡。 强弱分代假说奠定了垃圾收集器的设计原则:收集器应该将 Java 堆划分出不同的区域,然后将回收对象依据其年龄(年龄就是对象经历垃圾收集的次数)分配到不同的区域中进行存储。之后如果一个区域中的对象都是朝生夕灭的,那么收集器只需要关注少量对象的存活而不是去标记那些大量将要被回收的对象,此时就能以较小的代价获取较大的空间。最后再将难以消亡的对象集中到一块,根据强分代假说,它们是很难消亡的,因此虚拟机可以使用较低的频率进行回收,这就兼顾了时间和内存空间的开销。 @@ -260,11 +260,9 @@ System.gc(); 根据分代收集理论,收集范围可以分为以下几种类型: + **部分收集 (Partial GC)**:具体分为: -+ 新生代收集(Minor GC / Young GC):只对新生代进行垃圾收集; + + 新生代收集(Minor GC / Young GC):只对新生代进行垃圾收集; + 老年代收集(Major GC / Old GC):只对老年代进行垃圾收集。需要注意的是 Major GC 在有的语境中也用于指代整堆收集; - -+ 混合收集(Mixed GC):对整个新生代和部分老年代进行垃圾收集。 - + + 混合收集(Mixed GC):对整个新生代和部分老年代进行垃圾收集。 + **整堆收集 (Full GC)**:收集整个 Java 堆和方法区。 #### 3. 标记-清除算法 @@ -315,7 +313,6 @@ HotSpot 虚拟机中一共存在七款经典的垃圾收集器: -分别介绍如下: ### 5.1 Serial 收集器