From bee09759e30abb2ac12f6760f978997e1835ba3f Mon Sep 17 00:00:00 2001 From: CyC2018 Date: Fri, 23 Oct 2026 11:18:54 +0800 Subject: [PATCH] =?UTF-8?q?Update=20Java=20=E8=99=9A=E6=8B=9F=E6=9C=BA.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 字符串常量池和静态变量在 JDK 7 移入堆、JDK 8 元空间存放类元信息和运行时常量池;空间分配担保按 JDK 6u24 之后的规则描述,HandlePromotionFailure 已不起作用。 --- notes/Java 虚拟机.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/notes/Java 虚拟机.md b/notes/Java 虚拟机.md index b7a11901..48cde25b 100644 --- a/notes/Java 虚拟机.md +++ b/notes/Java 虚拟机.md @@ -92,7 +92,7 @@ java -Xms1M -Xmx2M HackTheJava HotSpot 虚拟机把它当成永久代来进行垃圾回收。但很难确定永久代的大小,因为它受到很多因素影响,并且每次 Full GC 之后永久代的大小都会改变,所以经常会抛出 OutOfMemoryError 异常。为了更容易管理方法区,从 JDK 1.8 开始,移除永久代,并把方法区移至元空间,它位于本地内存中,而不是虚拟机内存中。 -方法区是一个 JVM 规范,永久代与元空间都是其一种实现方式。在 JDK 1.8 之后,原来永久代的数据被分到了堆和元空间中。元空间存储类的元信息,静态变量和常量池等放入堆中。 +方法区是一个 JVM 规范,永久代与元空间都是其一种实现方式。JDK 1.7 把字符串常量池和类的静态变量从永久代移到了堆中,JDK 1.8 移除永久代,改用本地内存中的元空间存储类的元信息和运行时常量池。 ### 运行时常量池 @@ -423,7 +423,7 @@ G1 把堆划分成多个大小相等的独立区域(Region),新生代和 在发生 Minor GC 之前,虚拟机先检查老年代最大可用的连续空间是否大于新生代所有对象总空间,如果条件成立的话,那么 Minor GC 可以确认是安全的。 -如果不成立的话虚拟机会查看 HandlePromotionFailure 的值是否允许担保失败,如果允许那么就会继续检查老年代最大可用的连续空间是否大于历次晋升到老年代对象的平均大小,如果大于,将尝试着进行一次 Minor GC;如果小于,或者 HandlePromotionFailure 的值不允许冒险,那么就要进行一次 Full GC。 +如果不成立,虚拟机会继续检查老年代最大可用的连续空间是否大于历次晋升到老年代对象的平均大小,如果大于就进行 Minor GC,否则进行 Full GC。JDK 6 Update 24 之前还需要 HandlePromotionFailure 参数允许担保失败才会冒险进行 Minor GC,之后该参数不再起作用。 ### Full GC 的触发条件