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
相关推荐
码熔burning38 分钟前
(十 五)趣学设计模式 之 命令模式!
java·设计模式·命令模式
秋已杰爱42 分钟前
Qt显示一个hello world
开发语言·qt
我不会编程5552 小时前
Python Cookbook-2.24 在 Mac OSX平台上统计PDF文档的页数
开发语言·python·pdf
胡歌13 小时前
final 关键字在不同上下文中的用法及其名称
开发语言·jvm·python
程序员张小厨3 小时前
【0005】Python变量详解
开发语言·python
计算机-秋大田4 小时前
基于Spring Boot的乡村养老服务管理系统设计与实现(LW+源码+讲解)
java·vue.js·spring boot·后端·课程设计
盖盖衍上4 小时前
Java 泛型(Generics)详解与使用
java·开发语言·windows
深蓝海拓4 小时前
PySide(PyQT)重新定义contextMenuEvent()实现鼠标右键弹出菜单
开发语言·python·pyqt
没有十八岁5 小时前
云创智城YunCharge 新能源二轮、四轮充电解决方案(云快充、万马爱充、中电联、OCPP1.6J等多个私有单车、汽车充电协议)之新能源充电行业系统说明书
java·数据库·spring·汽车
小萌新上大分5 小时前
Minio搭建并在SpringBoot中使用完成用户头像的上传
java·spring boot·后端·minio·minio搭建·头像上传·minio入门