先本身弄個問題算法
產生這個STW問題有 dump線程 死鎖檢查 堆dupmbash
/**產生stw其它幾個因素:
* dump線程
* 死鎖檢查
* 堆dupm
* 垃圾回收算法:爲讓stw時間較長,增大年老代空間和選用serial old垃圾算法進行回收老年代
*
*
* jvm垃圾回收參數:-Xms512m -Xmx512m -Xmn4m -XX:+PrintGCDetails -XX:+UseSerialGC
* </code>
* @author zhanghua
*
*/
public class GenerateSTW {
/**
* 經過集合引用對象,保證對象不被gc回收
*/
private List<byte[]> content=new ArrayList<byte[]>();
public static void main(String[] args) {
GenerateSTW stw=new GenerateSTW();
stw.start();
}
private void start() {
while(true){
try {
content.add(new byte[1024]);
} catch (OutOfMemoryError e) {
//在不能夠分配的時候,進行清理部分空間,繼續運行,這樣會很快產生下一次垃圾回收
for(int i=0;i<1024;i++){
content.remove(i);
}
}
}
}
}
複製代碼
是否有方法儘量減小一次STW停頓時間?由此帶來的弊端是什麼?併發
答:減小一次STW停頓時間,我這裏從三個方面回答,jvm
一、個是垃圾算法選擇優化
垃圾算法選擇:如今都是多核cpu,能夠採用並行和併發收集器,若是是響應時間優化的系統應用 ,則jdk6版本通常spa
選擇的垃圾回收算法是:XX:+UseConcMarkSweepGC,即cms收集器,這個收集器垃圾回收時間短,可是垃圾回收總時間變長,使的下降吞 吐量,算法使用的是標記-清除,併發收集器不對內存空間進行壓縮,整理,因此運行一段時間之後會產生"碎片",使得運行效率下降. CMSFullGCsBeforeCompaction此值設置運行多少次GC之後對內存空間進行壓縮線程
二、一個是程序使用堆設置code
程序使用堆設置:應該根據程序運行狀況,經過Jvm垃圾回收分析,設置一個比較合適的堆大小,不能一意味的將堆設置過大,致使 程序回收很大一塊空間,因此會致使stw時間較長,對象
三、無用對象儘早釋放內存
無用對象儘早釋放:使用的對象,若是沒有用,儘早設置null,儘可能在年輕代將對象進行回收掉,能夠減小full gc停頓時長