JVM常用概念之垃圾回收设计与停顿

在我们应用程序运行期间,我们是需要尽可能避免垃圾回收。

图1:不同垃圾回收器的设计(黄色代表STW,绿色代表并发)

实验

计算机配置

bash 复制代码
Hardware Overview:

  Model Name:	MacBook Pro
  Model Identifier:	MacBookPro14,2
  Processor Name:	Intel Core i5
  Processor Speed:	3.1 GHz
  Number of Processors:	1
  Total Number of Cores:	2
  L2 Cache (per Core):	256 KB
  L3 Cache:	4 MB
  Memory:	8 GB
  Boot ROM Version:	428.0.0.0.0
  SMC Version (system):	2.44f1
  Serial Number (system):	
  Hardware UUID:	

JDK环境


实验源码

java 复制代码
import java.util.*;

public class Case3 {
    static List<Object> array;
    public static void main(String [] args) {
        array = new ArrayList<>();
        for (int i = 0; i < 100000000; i++) {
            array.add(new Object());
        }
    }
}

用例

JDK9-G1

bash 复制代码
time java -Xms4G -Xmx4G -Xlog:gc Case3
bash 复制代码
[0.036s][info][gc] Using G1
[1.576s][info][gc] GC(0) Pause Young (G1 Evacuation Pause) 370M->366M(4096M) 952.195ms
[2.817s][info][gc] GC(1) Pause Young (G1 Evacuation Pause) 744M->747M(4096M) 847.381ms
[4.056s][info][gc] GC(2) Pause Young (G1 Evacuation Pause) 1105M->1106M(4096M) 776.229ms
[5.561s][info][gc] GC(3) Pause Young (G1 Evacuation Pause) 1552M->1554M(4096M) 771.033ms
[6.332s][info][gc] GC(4) Pause Young (G1 Evacuation Pause) 1732M->1733M(4096M) 557.217ms
[6.899s][info][gc] GC(5) Pause Initial Mark (G1 Humongous Allocation) 1894M->1896M(4096M) 422.604ms
[6.899s][info][gc] GC(6) Concurrent Cycle
[8.534s][info][gc] GC(7) Pause Young (G1 Evacuation Pause) 2476M->2477M(4096M) 569.203ms
[9.226s][info][gc] GC(8) Pause Young (G1 Evacuation Pause) 2655M->2656M(4096M) 490.367ms
[12.341s][info][gc] GC(6) Pause Remark 2758M->2758M(4096M) 1.318ms
[13.057s][info][gc] GC(6) Pause Cleanup 2758M->2212M(4096M) 2.659ms
[13.173s][info][gc] GC(6) Concurrent Cycle 6273.724ms

real	0m13.399s
user	0m29.455s
sys	0m2.855s

JDK9-Parallel

bash 复制代码
time java -XX:+UseParallelOldGC -Xms4G -Xmx4G -Xlog:gc Case3
bash 复制代码
[0.024s][info][gc] Using Parallel
[1.591s][info][gc] GC(0) Pause Young (Allocation Failure) 878M->714M(3925M) 892.647ms
[3.270s][info][gc] GC(1) Pause Young (Allocation Failure) 1738M->1442M(3925M) 1371.100ms

real	0m3.644s
user	0m7.956s
sys	0m1.088s

JDK9-Concurrent Mark Sweep

bash 复制代码
time java -XX:+UseConcMarkSweepGC -Xms4G -Xmx4G -Xlog:gc Case3
bash 复制代码
Java HotSpot(TM) 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release.
[0.026s][info][gc] Using Concurrent Mark Sweep
[1.661s][info][gc] GC(0) Pause Young (Allocation Failure) 259M->231M(4062M) 1361.996ms
[2.293s][info][gc] GC(1) Pause Young (Allocation Failure) 497M->511M(4062M) 563.307ms
[2.974s][info][gc] GC(2) Pause Young (Allocation Failure) 777M->851M(4062M) 623.093ms
[3.527s][info][gc] GC(3) Pause Young (Allocation Failure) 1117M->1161M(4062M) 502.224ms
[4.807s][info][gc] GC(4) Pause Young (Allocation Failure) 1694M->1828M(4062M) 1038.882ms
[6.565s][info][gc] GC(5) Pause Young (Allocation Failure) 2094M->2364M(4062M) 1688.745ms
[6.580s][info][gc] GC(6) Pause Initial Mark 2369M->2369M(4062M) 14.197ms
[6.580s][info][gc] GC(6) Concurrent Mark
[9.074s][info][gc] GC(7) Pause Young (Allocation Failure) 3031M->3166M(4062M) 1581.572ms
[15.418s][info][gc] GC(6) Concurrent Mark 8838.424ms
[15.418s][info][gc] GC(6) Concurrent Preclean
[15.485s][info][gc] GC(6) Concurrent Preclean 67.031ms
[15.486s][info][gc] GC(6) Concurrent Abortable Preclean
[15.486s][info][gc] GC(6) Concurrent Abortable Preclean 0.126ms
[15.718s][info][gc] GC(6) Pause Remark 3390M->3390M(4062M) 232.467ms
[15.719s][info][gc] GC(6) Concurrent Sweep
[16.728s][info][gc] GC(6) Concurrent Sweep 1009.828ms
[16.728s][info][gc] GC(6) Concurrent Reset
[16.744s][info][gc] GC(6) Concurrent Reset 15.565ms

real	0m17.045s
user	0m29.167s
sys	0m4.394s

OpenJDK11-Shenandoah

bash 复制代码
time java -XX:+UseShenandoahGC -Xms4G -Xmx4G -Xlog:gc Case3
bash 复制代码
[0.006s][info][gc] Min heap equals to max heap, disabling ShenandoahUncommit
[0.012s][info][gc] Heuristics ergonomically sets -XX:+ExplicitGCInvokesConcurrent
[0.012s][info][gc] Heuristics ergonomically sets -XX:+ShenandoahImplicitGCInvokesConcurrent
[0.013s][info][gc] Using Shenandoah
[0.894s][info][gc] Trigger: Learning 1 of 5. Free (2860M) is below initial threshold (2867M)
[0.896s][info][gc] GC(0) Concurrent reset 0.560ms
[1.062s][info][gc] GC(0) Pause Init Mark (process weakrefs) 0.634ms
[3.511s][info][gc] Cancelling GC: Stopping VM
[3.511s][info][gc] GC(0) Concurrent marking (process weakrefs) 2449.346ms

real	0m3.760s
user	0m3.191s
sys	0m1.752s

JDK17-Epsilon

bash 复制代码
time java -XX:+UnlockExperimentalVMOptions -XX:+UseEpsilonGC -Xms4G -Xmx4G  -Xlog:gc Case3
bash 复制代码
[0.004s][info][gc] Using Epsilon
[0.005s][warning][gc,init] Consider enabling -XX:+AlwaysPreTouch to avoid memory commit hiccups
[0.199s][info   ][gc     ] Heap: 4096M reserved, 4096M (100.00%) committed, 205M (5.01%) used
[0.314s][info   ][gc     ] Heap: 4096M reserved, 4096M (100.00%) committed, 453M (11.07%) used
[0.442s][info   ][gc     ] Heap: 4096M reserved, 4096M (100.00%) committed, 676M (16.51%) used
[0.639s][info   ][gc     ] Heap: 4096M reserved, 4096M (100.00%) committed, 1014M (24.77%) used
[0.918s][info   ][gc     ] Heap: 4096M reserved, 4096M (100.00%) committed, 1222M (29.85%) used
[0.941s][info   ][gc     ] Heap: 4096M reserved, 4096M (100.00%) committed, 1517M (37.06%) used
[1.483s][info   ][gc     ] Heap: 4096M reserved, 4096M (100.00%) committed, 1725M (42.14%) used
[1.660s][info   ][gc     ] Heap: 4096M reserved, 4096M (100.00%) committed, 2274M (55.54%) used
[2.102s][info   ][gc     ] Heap: 4096M reserved, 4096M (100.00%) committed, 2482M (60.62%) used
[2.287s][info   ][gc     ] Heap: 4096M reserved, 4096M (100.00%) committed, 2690M (65.70%) used
[2.340s][info   ][gc     ] Heap: 4096M reserved, 4096M (100.00%) committed, 2730M (66.67%) used

real	0m2.551s
user	0m1.307s
sys	0m1.030s
相关推荐
YSL0701243 分钟前
C++基础
开发语言·c++
若亦_10 分钟前
Java中关于this的三种用法
java·开发语言·intellij-idea
山甫aa12 分钟前
锁一篇搞定:乐观锁、悲观锁、CAS、数据库锁与分布式锁【从零开始的 Web 后端学习】
java·数据库·分布式·后端·学习·web
软件技术NINI15 分钟前
基于SpringBoot和Vue的博物馆预约平台管理系统的设计与实现
java·毕业设计·毕设
2601_9687931439 分钟前
Python Requests 轻量自动化:无需浏览器,实现真人级账号浏览模拟
开发语言·python·自动化
eggwyw1 小时前
关于C++为什么不加入垃圾回收机制解析
开发语言·c++
独泪了无痕10 小时前
探索Pinyin4j-Java中的拼音转换利器
java·后端
道尔柯南11 小时前
C++ string 类详解:从常用接口到深拷贝,彻底掌握字符串处理
android·java·c++
来让爷抱一个12 小时前
Python 异步里混用同步库,事件循环被卡住的全过程
开发语言·python
kingx312 小时前
Bugku 3122 谷歌小恐龙题解:纯离线逆向 Vault 的 AES-GCM 加密资源(附 Python 解密器)
java·逆向·ctf·bugku·aes-gcm