jvm的內存配置 + OOM

eclipse中jvm內存配置java

-Xmx512m -Xms512m -Xmn128m -Xss128m -XX:MaxNewSize=256m -XX:MaxPermSize=256m

 

OOMdom

package com.shi.jvm;

public class StackTest {
	
	/**
	 * 遞歸調用
	 */
	public static void add() {
		add();
	}

	/**
	 * 	棧滿了異常
	 * Exception in thread "main" java.lang.StackOverflowError
	 * @param args
	 */
	public static void main(String[] args) {
		add();
	}

}
package com.shi.jvm;

import java.util.Random;
/**
 *  -Xms1024m -Xmx1024m   -XX:+PrintGCDetails
	堆初始化內存,堆最大內存    打印出堆GC回收信息
 * @author shiye
 *
 */
public class HeapSpaceTest {

	
	public static void main(String[] args) {
		
		/**
		 *    輸出:	MAX_MEMERY = 1808269312(字節)1724.5MB
				TOTAL_MEMERY = 122683392(字節)117.0MB
		 * @param args
		 */
//		long maxMemory = Runtime.getRuntime().maxMemory();//返回Java虛擬機試圖使用的最大內存量
//		long totalMemory = Runtime.getRuntime().totalMemory();//返回當前使用的java虛擬機的內存總量
//		System.out.println("MAX_MEMERY = " + maxMemory +"(字節)" + (maxMemory/(double)1024/1024) + "MB");
//		System.out.println("TOTAL_MEMERY = " + totalMemory +"(字節)" + (totalMemory/(double)1024/1024) + "MB");
		
		
		//-Xms8m -Xmx8m   -XX:+PrintGCDetails
		String str = "www.shiye";
		while(true) {
			str += str + new Random().nextInt(9999);
		}
		/**
		 * 結果: Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
		 */
	}
	// -Xms8m -Xmx8m   -XX:+PrintGCDetails
	// 打印垃圾回收信息
	
	
	//-Xms8m -Xmx32m   -XX:+HeapDumpOnOutOfMemoryError
	//生成內存快照文件  查看錯誤信息
	
}

 

package com.shi.jvm;

import java.util.ArrayList;
import java.util.List;

/**
 * OOM : GC overhead limit exceeded
 * 
 * 
 * -Xmx10m -Xms10m  -XX:+PrintGCDetails
 * @author shiye
	
結果:
Exception in thread "main" [Full GC (Ergonomics) java.lang.OutOfMemoryError: GC overhead limit exceeded
[PSYoungGen: 2047K->0K(2560K)] [ParOldGen: 7051K->517K(7168K)] 9099K->517K(9728K), [Metaspace: 2624K->2624K(1056768K)], 0.0057765 secs] [Times: user=0.02 sys=0.00, real=0.01 secs] 
	at java.lang.Integer.toString(Unknown Source)
	at java.lang.String.valueOf(Unknown Source)
	at com.shi.jvm.GcOverHeadTest.main(GcOverHeadTest.java:27)
 */
public class GcOverHeadTest {

	public static void main(String[] args) {

		List<String> list = new ArrayList<>();
		int i = 0;
		while (true) {
			// a4.intern();//將該對象AA的引用保存到常量池上
			list.add(String.valueOf(i++).intern());
		}
	}
}

package com.shi.jvm;

import java.nio.ByteBuffer;

/**
 * 	運行參數:-Xms10m -Xmx10m -XX:+PrintGCDetails -XX:MaxDirectMemorySize=5m
 * 	直接內存溢出
 * 	allocateDirect 使用的是直接內存,不是堆內存
 * @author shiye
 *
結果:
 配置的maDirectMemeory: 5.0MB
[GC (System.gc()) [PSYoungGen: 828K->504K(2560K)] 828K->592K(9728K), 0.0037700 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
[Full GC (System.gc()) [PSYoungGen: 504K->0K(2560K)] [ParOldGen: 88K->566K(7168K)] 592K->566K(9728K), [Metaspace: 2647K->2647K(1056768K)], 0.0045972 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
Exception in thread "main" java.lang.OutOfMemoryError: Direct buffer memory
	at java.nio.Bits.reserveMemory(Unknown Source)
	at java.nio.DirectByteBuffer.<init>(Unknown Source)
	at java.nio.ByteBuffer.allocateDirect(Unknown Source)
	at com.shi.jvm.DirectBufferMemoryTest.main(DirectBufferMemoryTest.java:16)
 */
public class DirectBufferMemoryTest {

	public static void main(String[] args) throws InterruptedException {
		System.out.println("配置的maDirectMemeory: " + (sun.misc.VM.maxDirectMemory()) / (double) 1024 / 1024 + "MB");
		Thread.sleep(3000);
		ByteBuffer b = ByteBuffer.allocateDirect(6*1024*1024);//分配6m的內存
	}

}

package com.shi.jvm;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * OOM: 不能去建立本地線程的異常
 * 
 * @author shiye
 *	
 *	改異常會在Liunx中報錯:unable create native thread 異常,
 *	
 */
public class UnableCreateNativeThread {

	public static void main(String[] args) {
		AtomicInteger index = new AtomicInteger(1);
		while (true) {
			new Thread(() -> {
				try {
					System.out.println("建立了線程:" + index.getAndIncrement());
					Thread.sleep(Integer.MAX_VALUE);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}).start();
		}
	}

}

相關文章
相關標籤/搜索