スタックオーバーフロー、スタックオーバーフロー、定数プールオーバーフロー、メソッド領域オーバーフロー
2584 ワード
1、ヒープオーバーフロー
2、スタックオーバーフロー
3、定数プールオーバーフロー
4、メソッド領域オーバーフロー
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 {
}
}