diff --git a/notes/Java 虚拟机.md b/notes/Java 虚拟机.md index 113f1f74..b427474f 100644 --- a/notes/Java 虚拟机.md +++ b/notes/Java 虚拟机.md @@ -430,7 +430,6 @@ G1 把新生代和老年代划分成多个大小相等的独立区域(Region | **Parallel Old** | 并行 | 串行 | 老年代 | 标记-整理 | 吞吐量优先 | 在后台运算而不需要太多交互的任务 | | **CMS** | 并行 | 并发 | 老年代 | 标记-清除 | 响应速度优先 | 集中在互联网站或 B/S 系统服务端上的 Java 应用 | | **G1** | 并行 | 并发 | 新生代 + 老年代 | 标记-整理 + 复制算法 | 响应速度优先 | 面向服务端应用,将来替换 CMS | -来替换 CMS | ## 内存分配与回收策略 @@ -491,7 +490,7 @@ G1 把新生代和老年代划分成多个大小相等的独立区域(Region **(五)Concurrent Mode Failure** -执行 CMS GC 的过程中同时有对象要放入老年代,而此时老年代空间不足(有时候“空间不足”是 CMS GC 时当前的浮动垃圾过多导致暂时性的空间不足触发 Full GC),便会报 Concurrent Mode Failure 错误,并触发 Full GC。 +执行 CMS GC 的过程中同时有对象要放入老年代,而此时老年代空间不足(有时候“空间不足”是 CMS GC 时当前的浮动垃圾过多导致暂时性的空间不足),便会报 Concurrent Mode Failure 错误,并触发 Full GC。 # 三、类加载机制 @@ -515,7 +514,7 @@ G1 把新生代和老年代划分成多个大小相等的独立区域(Region ## 类初始化时机 -虚拟机规范中并没有强制约束何时进行加载,但是规范严格规定了有且只有下列五种情况必须对类进行初始化(加载、验证、准备都会随着发生): +虚拟机规范中并没有强制约束何时进行加载,但是规范严格规定了有且只有下列五种情况必须对类进行初始化(加载、验证、准备都会随之发生): - 遇到 new、getstatic、putstatic、invokestatic 这四条字节码指令时,如果类没有进行过初始化,则必须先触发其初始化。最常见的生成这 4 条指令的场景是:使用 new 关键字实例化对象的时候;读取或设置一个类的静态字段(被 final 修饰、已在编译期把结果放入常量池的静态字段除外)的时候;以及调用一个类的静态方法的时候。 @@ -532,7 +531,7 @@ G1 把新生代和老年代划分成多个大小相等的独立区域(Region - 通过子类引用父类的静态字段,不会导致子类初始化。 ```java -System.out.println(SubClass.value); // value 字段在 SuperClass 中定义 +System.out.println(SubClass.value); // value 字段在 SuperClass 中定义 ``` - 通过数组定义来引用类,不会触发此类的初始化。该过程会对数组类进行初始化,数组类是一个由虚拟机自动生成的、直接继承自 Object 的子类,其中包含了数组的属性和方法。