java 中STW現象解決

先本身弄個問題算法

產生這個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停頓時長

相關文章
相關標籤/搜索