From 7a2e7aeb69c4afe9e30ab930ed7008acbc9f4eda Mon Sep 17 00:00:00 2001 From: wardseptember Date: Sun, 2 Aug 2020 15:37:17 +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 CMS收集器,“浮动垃圾”部分说法不准确,启用Serial Old收集器并不是因为预留的内存不够存放浮动垃圾,而是预留的内存无法满足用户线程的使用,也就是用户线程创建新对象内存不足。 --- docs/notes/Java 虚拟机.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/notes/Java 虚拟机.md b/docs/notes/Java 虚拟机.md index 1a6e0cff..139aa188 100644 --- a/docs/notes/Java 虚拟机.md +++ b/docs/notes/Java 虚拟机.md @@ -351,7 +351,7 @@ CMS(Concurrent Mark Sweep),Mark Sweep 指的是标记 - 清除算法。 具有以下缺点: - 吞吐量低:低停顿时间是以牺牲吞吐量为代价的,导致 CPU 利用率不够高。 -- 无法处理浮动垃圾,可能出现 Concurrent Mode Failure。浮动垃圾是指并发清除阶段由于用户线程继续运行而产生的垃圾,这部分垃圾只能到下一次 GC 时才能进行回收。由于浮动垃圾的存在,因此需要预留出一部分内存,意味着 CMS 收集不能像其它收集器那样等待老年代快满的时候再回收。如果预留的内存不够存放浮动垃圾,就会出现 Concurrent Mode Failure,这时虚拟机将临时启用 Serial Old 来替代 CMS。 +- 无法处理浮动垃圾,可能出现 Concurrent Mode Failure。浮动垃圾是指并发标记和并发清除阶段,由于用户线程继续运行而产生的垃圾,这部分垃圾只能到下一次 GC 时才能进行回收。由于用户线程还在继续运行,因此需要预留出一部分内存提供给用户线程使用,意味着 CMS 收集不能像其它收集器那样等待老年代快满的时候再回收。如果预留的内存无法满足程序分配新对象的需要,就会出现 一次“并发失败”(Concurrent Mode Failure),这时虚拟机将临时启用 Serial Old 来替代 CMS收集老年代的垃圾。 - 标记 - 清除算法导致的空间碎片,往往出现老年代空间剩余,但无法找到足够大连续空间来分配当前对象,不得不提前触发一次 Full GC。 ### 7. G1 收集器