大对象直接进老年代的坑???
大对象直接进入老年代有几个比较坑爹的地方:
JDK版本 1.7.0_79
新对象大于Eden区总大小的时候,会被直接扔到老年代,实验:
-Xms20M -Xmx20M -Xmn10M -XX:+PrintGCDetails -XX:+UseParNewGC
7M<8M Eden,分配到Eden:

8M = 8M Eden,但是小于整个年轻代大小9M,直接分配到Old Gen:

9M> 8M,直接分配到Old Gen:

6M < 8M,但是大于Eden剩余空间,触发了MinorGC,6M被分到了Eden:

以上说明不是大于Eden剩余空间就分配到Old Gen,而是大于Eden总空间
说回PretenureSizeThreshold这个参数,
-Xms200m -Xmx200m -Xmn100m -XX:+PrintGCDetails -XX:SurvivorRatio=3 -XX:+PrintFlagsFinal -XX:PretenureSizeThreshold=31m -XX:+UseParNewGC
到t3触发MinorGC后,Eden区还剩yue45m,大于t4的43m,t4被分配到Eden

这里t3触发MinorGC后,Eden剩余空间大约45m,t4 45m,直接分配到了Old Gen,

以上,PretenureSizeThreshold好像只在第二种场景才起了作用?不是大于PretenureSizeThreshold设置的值就直接扔老年代吗?望大神们解答!!
JDK版本 1.7.0_79
新对象大于Eden区总大小的时候,会被直接扔到老年代,实验:
-Xms20M -Xmx20M -Xmn10M -XX:+PrintGCDetails -XX:+UseParNewGC
7M<8M Eden,分配到Eden:

8M = 8M Eden,但是小于整个年轻代大小9M,直接分配到Old Gen:

9M> 8M,直接分配到Old Gen:

6M < 8M,但是大于Eden剩余空间,触发了MinorGC,6M被分到了Eden:

以上说明不是大于Eden剩余空间就分配到Old Gen,而是大于Eden总空间
说回PretenureSizeThreshold这个参数,
-Xms200m -Xmx200m -Xmn100m -XX:+PrintGCDetails -XX:SurvivorRatio=3 -XX:+PrintFlagsFinal -XX:PretenureSizeThreshold=31m -XX:+UseParNewGC
到t3触发MinorGC后,Eden区还剩yue45m,大于t4的43m,t4被分配到Eden

这里t3触发MinorGC后,Eden剩余空间大约45m,t4 45m,直接分配到了Old Gen,

以上,PretenureSizeThreshold好像只在第二种场景才起了作用?不是大于PretenureSizeThreshold设置的值就直接扔老年代吗?望大神们解答!!
...全文
相关推荐
技术人员也应懂艺术~~:不要把“老年代”叫成“Old Generation”
NULL 博文链接:https://eyesmore.iteye.com/blog/1400249
【java】为什么大对象要直接放入到老年代
假设大对象最后会晋升老年代,而新生代是基于复制算法来回收垃圾的,由两个Survivor区域配合完成复制算法,如果新生代中出现大对象且能屡次躲过GC,那这个对象就会在两个Survivor区域中来回复制,直至最后升入老年代,而大对象在内存里来回复制移动,就会消耗更多的时间。假设大对象最后不会晋升老年代,新生代空间是有限的,在新生代里的对象大部分都是朝生夕死的,如果让一个大对象占据了新生代空间,那么相比起正常的对象被分配在新生代,大对象无疑会让新生代GC提早发生。
java大对象
大对象使用,很实用.对做报表非常好
进CE工具。不用改名,直接进CE
进CE工具。不用改名,直接进CE,导航进系统软件
通过HTML演示JVM的垃圾回收-新生代与老年代
通过HTML演示JVM的垃圾回收-新生代与老年代


