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