堆溢出、栈溢出、常量池溢出、方法区溢出

1、堆溢出

package jdk;

import java.util.ArrayList;
import java.util.List;
/**
 * 
 * @author Yong Huang
 * VM args: -Xms20M -Xmx20M
 */
public class HeapOOM {

	public HeapOOM() {
		// TODO Auto-generated constructor stub
	}

	static class OOMObject {

	}

	public static void main(String[] args) {
		List<OOMObject> list = new ArrayList<OOMObject>();
		while (true) {
			list.add(new OOMObject());
		}
	}

}

2、栈溢出

package jdk;
/**
 * 
 * @author Yong Huang
 * VM args: -Xss128K
 */
public class JavaVMStackSOF {

	private int stackLength = 1;

	public JavaVMStackSOF() {
		// TODO Auto-generated constructor stub
	}

	public void stackLeak() {
		stackLength++;
		stackLeak();
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		JavaVMStackSOF oom = new JavaVMStackSOF();
		try {
			oom.stackLeak();
		} catch (Throwable e) {
			System.out.println("stack length:" + oom.stackLength);
			throw e;
		}
	}

}

3、常量池溢出

package jdk;

import java.util.ArrayList;
import java.util.List;
/**
 * 
 * @author Yong Huang
 * VM args: -XX:PermSize=10M -XX:MaxPermSize=10M
 */
public class RuntimeConstantPoolOOM {

	public RuntimeConstantPoolOOM() {
		// TODO Auto-generated constructor stub
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		List<String> list = new ArrayList<String>();
		int i = 0;
		while (true) {
			list.add(String.valueOf(i++).intern());
		}
	}
}

4、方法区溢出

package jdk;

import java.lang.reflect.Method;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
/**
 * 
 * @author Yong Huang
 * VM args: -XX:PermSize=10M -XX:MaxPermSize=10M
 */
public class JavaMethodAreaOOM {

	public JavaMethodAreaOOM() {
		// TODO Auto-generated constructor stub
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		while (true) {
			Enhancer enhancer = new Enhancer();
			enhancer.setSuperclass(OOMObject.class);
			enhancer.setUseCache(false);
			enhancer.setCallback(new MethodInterceptor() {

				@Override
				public Object intercept(Object arg0, Method arg1,
						Object[] arg2, MethodProxy arg3) throws Throwable {
					// TODO Auto-generated method stub
					return arg3.invokeSuper(arg0, arg2);
				}
			});
			enhancer.create();
		}
	}

	static class OOMObject {

	}

}


你可能感兴趣的:(jvm,内存溢出)