JVMシリーズ(二)各エリアのOOM
7094 ワード
stackのメモリオーバーフローdemo、無限再帰:
public class StackOOM {
private static void fun(){
fun();
}
/**
* VM arg -Xss128K
* @param args
*/
public static void main(String[] args) {
fun();
}
}
direct memory:
public class DirectMemoryOOM {
static int ONE_MB = 1024*1024;
/**
* -XX:MaxDirectMemorySize=5M
* @param args
* @throws InterruptedException
*/
public static void main(String[] args) throws InterruptedException {
List<ByteBuffer> list = new ArrayList<ByteBuffer>();
for(int i=0; i<ONE_MB;++i){
ByteBuffer buffer = ByteBuffer.allocateDirect(ONE_MB*128);
list.add(buffer);
System.out.println(" "+(i+1)+" 128MB");
}
}
}
heap:
public class HeapOOM {
static int MB = 1024*1024;
/**
* -Xmx16M
* @param args
*/
public static void main(String[] args) {
List<Object> list = new ArrayList<Object>();
for(int i=0; i<1000; ++i){
ByteBuffer bb = java.nio.ByteBuffer.allocate(MB);
list.add(bb);
System.out.println(" "+(i+1)+" MB");
}
}
}
定数プール:
public class ConstantPoolOOM {
/**
* -XX:MaxPermSize=10M
* @param args
*/
public static void main(String[] args) {
List<Object> list = new ArrayList<Object>();
for(int i=0; i<1000; ++i){
list.add(UUID.randomUUID().toString().intern());
System.out.println(" "+(i+1)+" ");
}
}
}
メソッド領域(cglibによって、大量のバイトコードが強化され、メソッド領域を爆発させる):
public class MethodAreaOOM {
static class OOMObject {
}
/**
* -XX:MaxPermSize=10M
* @param args
*/
public static void main(String[] args) {
for (int i = 0; i < 9999; ++i) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(OOMObject.class);
enhancer.setUseCache(false);
enhancer.setCallback(new MethodInterceptor() {
public Object intercept(Object obj, Method method,
Object[] args, MethodProxy proxy) throws Throwable {
return proxy.invokeSuper(obj, args);
}
});
enhancer.create();
}
}
}
具体的なコードはgithubを参照してください.https://github.com/emmerichLuang/differentOOM