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停顿时长

相关文章
相关标签/搜索