模拟JVM的Young GC

举报
JavaEdge 发表于 2022/01/26 14:41:51 2022/01/26
【摘要】 JVM参数示范(基于JDK 1.8)用如下JVM参数运行代码:# 初始新生代大小 5M-XX:NewSize=5242880# 最大新生代大小 5M-XX:MaxNewSize=5242880# 初始堆大小 10M-XX:InitialHeapSize=10485760# 最大堆大小 10M-XX:MaxHeapSize=10485760-XX:SurvivorRatio=8# 大对象阈值...

JVM参数示范(基于JDK 1.8)

用如下JVM参数运行代码:

# 初始新生代大小 5M
-XX:NewSize=5242880
# 最大新生代大小 5M
-XX:MaxNewSize=5242880
# 初始堆大小 10M
-XX:InitialHeapSize=10485760
# 最大堆大小 10M
-XX:MaxHeapSize=10485760
-XX:SurvivorRatio=8
# 大对象阈值是10MB
-XX:PretenureSizeThreshold=10485760
-XX:+UseParNewGC
-XX:+UseConcMarkSweepGC

如何打印JVM GC日志?

GC日志打印选型:

-XX:+PrintGCDetils:打印详细gc日志

-XX:+PrintGCTimeStamps:这个参数可以打印出来每次GC发生的时间

-Xloggc:gc.log:这个参数可以设置将gc日志写入一个磁盘文件

加上该参数后,JVM参数如下:

-XX:NewSize=5242880
-XX:MaxNewSize=5242880
-XX:InitialHeapSize=10485760
-XX:MaxHeapSize=10485760
-XX:SurvivorRatio=8
-XX:PretenureSizeThreshold=10485760
-XX:+UseParNewGC
-XX:+UseConcMarkSweepGC
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-Xloggc:gc.log

实例

对象是如何分配在Eden

byte[] array1 = new byte[1024 * 1024];

该行会在JVM Eden内放入一个1M数组,同时在main线程的虚拟机栈压入一个main方法栈帧,其栈帧内部有一“arr1”变量,该变量指向Eden的那1M数组:

arr1 = new byte[1024 * 1024];

此时会在Eden创建第二个数组,局部变量指向其。然后第一个数组无人引用,成了垃圾:

byte[] array1 = new byte[1024 * 1024];

在Eden创建第三个数组,同时让arr1指向第三个数组,此时前两个数组都无人引用,都成了垃圾:

arr1 = null;

arr1啥都不指了,导致之前创建的3数组全部变成垃圾:

byte[] arr2 = new byte[2 * 1024 * 1024];

分配一个2MB大小的数组,尝试放入Eden,这时Eden放的下吗?

显然不行,Eden共4M,已放入3个1M数组,只剩1M,所以这时就会触发Y-GC。

采用指定JVM参数运行程序

然后运行即可,运行完后,会出现gc.log文件,即本次程序运行的gc日志:

打开gc.log文件,我们会看到如下所示的gc日志:

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。