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
相关推荐
心平气和量大福大8 分钟前
C#-WPF-UserControl-生命周期(加载 退出)
开发语言·c#·wpf
小龙报13 分钟前
【优选算法】1. 水果成蓝 2.找到字符串中所有字母的异位词
java·c语言·数据结构·数据库·c++·redis·算法
sunywz20 分钟前
【c#】 Web Deploy一键发布,IIS部署全流程
开发语言·前端·c#
自强的小白34 分钟前
重点!起始时间和结束时间与创建时间和修改时间的区别(localdate与LocaldateTIME区别)以及增删改查什么时候设置目前时间(添加和更新员工时)
java
Brilliantwxx41 分钟前
【Linux】 软件包管理器(yum)+ Vim使用
linux·运维·服务器·开发语言·编辑器·vim
雪的季节1 小时前
Python 线程同步与异步编程 全解析
java·开发语言
吃饱了得干活1 小时前
缓存与数据库一致性:从理论到实战
java·后端·面试
520拼好饭被践踏1 小时前
JAVA+Agent学习day22
java·开发语言·后端·学习
笨蛋不要掉眼泪1 小时前
Java虚拟机:堆的参数配置
java·开发语言·jvm
霸道流氓气质1 小时前
SpringBoot中使用JasperReports 报表引擎 — 介绍、原理与使用实践
java·spring boot·后端