日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

说说MaxTenuringThreshold这个参数

發布時間:2024/1/17 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 说说MaxTenuringThreshold这个参数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

MaxTenuringThreshold這個參數用于控制對象能經歷多少次Minor GC才晉升到舊生代,默認值是15,那是不是意味著對象要經歷15次minor gc才晉升到舊生代呢,來看下面的一個例子。

public class GCTenuringThreshold{
public static void main(String[] args) throws Exception{
GCMemoryObject object1=new GCMemoryObject(2);
GCMemoryObject object2=new GCMemoryObject(8);
GCMemoryObject object3=new GCMemoryObject(8);
GCMemoryObject object4=new GCMemoryObject(8);
object2=null;
object3=null;
GCMemoryObject object5=new GCMemoryObject(8);
Thread.sleep(4000);
object2=new GCMemoryObject(8);
object3=new GCMemoryObject(8);
object2=null;
object3=null;
object5=null;
GCMemoryObject object6=new GCMemoryObject(8);
Thread.sleep(5000);
}
}
class GCMemoryObject{
private byte[] bytes=null;
public GCMemoryObject(int multi){
bytes=new byte[1024*256*multi];
}
}

以-Xms20M �Xmx20M �Xmn10M �XX:+UseSerialGC參數執行以上代碼,通過jstat -gcutil [pid] 1000 10的方式查看執行效果,很驚訝執行結果竟然是在第二次minor GC的時候object1就被晉升到old中了,而可以肯定的是這個時候to space空間是充足的,也就是說并不是在to space空間充足的情況下,對象一定要經歷MaxTenuringThreshold次才會晉升到old,那具體規則到底是怎么樣的呢,翻看Hotspot 6 update 21中SerialGC的實現,可以看到在每次minor GC后,會對這個存活周期的閾值做計算,計算的代碼如下:

size_t desired_survivor_size = (size_t)((((double) survivor_capacity)*TargetSurvivorRatio)/100);
size_t total = 0;
int age = 1;
assert(sizes[0] == 0, "no objects with age zero should be recorded");
while (age total += sizes[age];
// check if including objects of age 'age' made us pass the desired
// size, if so 'age' is the new threshold
if (total > desired_survivor_size) break;
age++;
}
int result = age
其中desired_survivor_size是指survivor space/2,從上面的代碼可看出,在計算存活周期這個閾值時,hotspot會遍歷所有age的table,并對其所占用的大小進行累積,當累積的大小超過了survivor space的一半時,則以這個age作為新的存活周期閾值,最后取age和MaxTenuringThreshold中更小的一個值。

按照這樣的規則,上面的運行效果就可驗證了,第一次minor gc的時候存活周期的閾值為MaxTenuringThreshold,minor gc結束后計算出新的閾值為1,在第二次minor gc時object 1的age已經是1了,因此object1被晉升到了舊生代。

這個規則對于Serial GC以及ParNew GC(但對于開啟了UseAdaptiveSizePolicy的ParNew GC而言也無效,默認是不開啟的)均有效,對于PS(Parallel Scavenge) GC而言,在默認的情況下第一次以InitialTenuringThreshold(默認為7)為準,之后在每次minor GC后均會動態計算,規則比上面的復雜,后續再另寫一篇blog來說,在設置-XX:-UseAdaptiveSizePolicy后,則以MaxTenuringThrehsold為準,并且不會重新計算,會是恒定值。

如希望跟蹤每次minor GC后新的存活周期的閾值,可在啟動參數上增加:-XX:+PrintTenuringDistribution,輸出的信息中的:
Desired survivor size 1048576 bytes, new threshold?7 (max 15)
new threshold 7即標識新的存活周期的閾值為7。

總結

以上是生活随笔為你收集整理的说说MaxTenuringThreshold这个参数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。