• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

关于java:JVM对象进入老年代的四种方式3实战篇

java 搞代码 3年前 (2022-02-14) 13次浏览 已收录 0个评论
文章目录[隐藏]

对象进入老年代的四种形式

  • minor gc后,survivor区空间不能包容全副存活对象
  • 存活对象达到年龄阈值。比方15
  • 大对象
  • 动静年龄判断

大对象

首先,咱们简略回顾一下。

书本,也没阐明,多大的对象才是大对象,比拟形象。

咱们这里间接具体点:

-XX:PretenureSizeThreshold=3m

大于等于3m的对象,就是大对象。

JVM配置参数

-XX:NewSize=10m -XX:MaxNewSize=10m -XX:InitialHeapSize=20m -XX:MaxHeapSize=20m -XX:SurvivorRatio=8 -XX:PretenureSizeThreshold=3m -XX:MaxTenuringThreshold=15 -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:bigobject.log

代码:

byte[] array1 = new byte[2*_1MB];
byte[] array2 = new byte[3*_1MB];

因为2m的对象不是大对象,因而调配到eden区。而3m的对象是大对象,因而调配到old区。

下面,这些都是咱们依据实践来揣测进去的。

接下来,咱们运行一下代码,而后查问日志文件bigobject.log

Java HotSpot(TM) 64-Bit Server VM (25.261-b12) for bsd-amd64 JRE (1.8.0_261-b12), built on Jun 18 2020 06:38:55 by "java_re" with gcc 4.2.1 Compatible Apple LLVM 10.0.0 (clang-1000.11.45.5)
Memory: 4k page, physical 33554432k(382392k free)

/proc/meminfo:

CommandLine flags: -XX:InitialHeapSize=20971520 -XX:MaxHeapSize=20971520 -XX:MaxNewSize=10485760 -XX:MaxTenuringThreshold=15 -XX:NewSize=10485760 -XX:OldPLABSize=16 -XX:PretenureSizeThreshold=3145728 -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:SurvivorRatio=8 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseConcMarkSweepGC -XX:+UseParNewGC 
Heap
 par new generation   total 9216K, used 4849K [0x00000007bec00000, 0x00000007bf600000, 0x00000007bf600000)
  eden space 8192K,  59% used [0x00000007bec00000, 0x00000007bf0bc580, 0x00000007bf400000)
  from space 1024K,   0% used [0x00000007bf400000, 0x00000007bf400000, 0x00000007bf500000)
  to   space 1024K,   0% used [0x00000007bf500000, 0x00000007bf500000, 0x00000007bf600000)
 concurrent mark-sweep generation total 10240K, used 3072K [0x00000007bf600000, 0x00000007c0000000, 0x00000007c0000000)
 Metaspace       used 3074K, capacity 4496K, committed 4864K, reserved 1056768K
  class space    used 337K, capacity 388K, committed 512K, reserved 1048576K

当初,咱们剖析一下日志内容,来验证咱们的猜想是否正确。

CommandLine flags: -XX:InitialHeapSize=20971520 -XX:MaxHeapSize=20971520 -XX:MaxNewSize=10485760 -XX:MaxTenuringThreshold=15 -XX:NewSize=10485760 -XX:OldPLABSize=16 -XX:PretenureSizeThreshold=3145728 -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:SurvivorRatio=8 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseConcMarkSweepGC -XX:+UseParNewGC
Heap

下面这一堆,就是咱们本人设置的JVM参数,也有一些零碎帮咱们增加的。比方:-XX:+UseCompressedClassPointers -XX:+UseCompressedOops

这些不是重点,你理解一下就好。

重点是这个:

Heap  
 par new generation   total 9216K, used 4849K [0x00000007bec00000, 0x00000007bf600000, 0x00000007bf600000)
  eden space 8192K,  59% used [0x00000007bec00000, 0x00000007bf0bc580, 0x00000007bf400000)
  from space 1024K,   0% used [0x00000007bf400000, 0x00000007bf400000, 0x00000007bf500000)
  to   space 1024K,   0% used [0x00000007bf500000, 0x00000007bf500000, 0x00000007bf600000)
 concurrent mark-sweep generation total 10240K, used 3072K [<div style="color:transparent">来源gaodai.ma#com搞##代!^码网</div>0x00000007bf600000, 0x00000007c0000000, 0x00000007c0000000)

代表的含意是:GC后堆的状况,留神是GC后。这里特别强调一下。

par new generation total 9216K, used 4849K
代表的新生代,当初总的空间大小是9216K,已应用的空间大小是4849K。

其实咱们晓得,有2M对象是进入了eden区的,然而当初4849K显著是大于2048K(2M)的。

那阐明了什么?

阐明,其实JVM除了加载咱们本人写的对象外,还会加载一些其余未知对象。未知对象,次要由JVM自身产生,这部分大家先疏忽就好

回到次要问题上:大对象是否会间接进入老年代。

咱们看以下这段日志:

concurrent mark-sweep generation total 10240K, used 3072K

老年代的总空间大小是10240K,目前曾经应用了3072K。

看到这里,其实置信大家曾经能够明确了。咱们把大对象定义为大于等于3m的对象。而日志也通知咱们,目前老年代曾经被占用了3072K,即3m。

因而,到这里咱们曾经用代码验证了:大对象会间接进入老年代。


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:关于java:JVM对象进入老年代的四种方式3实战篇

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址