大物件直接進入老年代有幾個比較坑爹的地方:
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設定的值就直接扔老年代嗎?望大神們解答!!
uj5u.com熱心網友回復:
別沉
uj5u.com熱心網友回復:
別沉
uj5u.com熱心網友回復:
你用的哪種垃圾收集器?這個引數只對Serial/ParNew管用吧,別的收集器不認的uj5u.com熱心網友回復:
把-XX:PretenureSizeThreshold=31m 改成 -XX:PretenureSizeThreshold= 31*1024*1024的值試下,對這個引數貌似不能用 m 為單位uj5u.com熱心網友回復:
1.XX:PretenureSizeThreshold單位是位元組2.如果還不行,需要禁用TLAB,引數-XX:-UseTLAB
uj5u.com熱心網友回復:
大佬好,請問這個在控制臺列印堆疊資訊時怎么弄得?轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/81183.html
標籤:Java相關
