それらの年で、我々はOOMが発生しました

JVMのメモリ・モデル

インターネット上の最初のトーク、JVMのメモリ・モデルは、ダイレクト・メモリの写真を見つけるために、便利は後述します

この絵は本当に常に新しい見ていると、今日我々は再びそれを再検討するメモリの観点から溢れ。地区方法も、非ヒープ、ホットスポットとして知られている、パーマ領域と呼ばれる1.7、1.8元空間と呼ばれるので、オーバーフロー領域は、1.7のOutOfMemoryErrorある:PermGenスペース、1.8のOutOfMemoryError :?メタスペースであります

ヒープオーバーフローより一般的な、OutOfMemoryErrorが発生:Javaヒープスペース

VMのスタックオーバーフローはStackOverflowErrorがあります

ネイティブメソッドスタックますjava.lang.OutOfMemoryErrorを:新しいネイティブスレッドを作成することができません

ダイレクトメモリは、 OutOfMemoryErrorがスローされます:ダイレクトバッファメモリを

これらのスペースは、一つ一つを爆発します

仮想マシンのスタックにStackOverflowErrorを爆発するファースト

保持再帰呼び出し、JVMはSOFEその結果、スタックフレームスタックの仮想マシン上のスペースを割り当てなければならない、また、再帰の数を見ることができる興味、-Xss、コマンドによって構成されてもよいJinfoの-flag ThreadStackSizeは[PID]缶スタック領域の設定を確認してください

public class StackOverflowErrorDemo {
    private static void test() {
        test();
    }

    public static void main(String[] args) {
        test();
    }
}
复制代码

再び爆発するヒープのOutOfMemoryError:Javaヒープスペース

最初-Xmx8m -Xms8mを指定し、8メートルバイト配列に直接スタックを生成し、効果を直接見ることができます

public class JavaHeapSpaceDemo {
    public static void main(String[] args) {
        byte[] bytes = new byte[8 * 1014 * 1024];
    }
}
复制代码

スレッドの例外「メイン」java.lang.OutOfMemoryErrorを:com.meituan.waimai.jvm.JavaHeapSpaceDemo.mainでのJavaヒープ領域(JavaHeapSpaceDemo.java:11)

前記方法エリアあずかります

それが1.7である場合は、クラスに情報を生成し続けることが私たちを必要とPemGenスペースがあるでしょう。1.7以来、文字列定数プールは、ヒープに移動されているので、(String.internを使用)パーマオーバーフローを引き起こしません

public class OOMDemo {
    public static void main(String[] args) {
        String str = "hello";
        List<String> list = Lists.newArrayList();
        for (int i = 0; i < Integer.MAX_VALUE; i++) {
            str += (i + "").intern();
            list.add(str);
        }
    }
}
复制代码

スレッド "メイン" java.lang.OutOfMemoryErrorを中に例外:java.langのでjava.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:124)でjava.util.Arrays.copyOf(Arrays.java:3332)でJavaヒープスペース。 com.meituan.waimai.jvm.JavaHeapSpaceDemo.main(JavaHeapSpaceDemo.java:18)でjava.lang.StringBuilder.append(StringBuilder.java:136)でAbstractStringBuilder.append(AbstractStringBuilder.java:448)

そして、それを行う方法、パーマ面積が爆発するまで、我々は、動的にいくつかの種類を生成する必要がある場合は、JVMパラメータ:-XX:MaxPermSizeを= 8メートル

    static class OOMTest{}

    public static void main(final String[] args) {
        int i = 0;

        try {
            for (; ; ) {
                i++;
                Enhancer enhancer = new Enhancer();
                enhancer.setSuperclass(OOMTest.class);
                enhancer.setUseCache(false);
                enhancer.setCallback(new MethodInterceptor() {
                    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
                        return methodProxy.invokeSuper(o, args);
                    }
                });
                enhancer.create();
            }
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
    }
}
复制代码

java.lang.OutOfMemoryErrorを::によって引き起こさjava.lang.ClassLoader.defineClass(ClassLoader.javaでjava.lang.ClassLoader.defineClassCond(ClassLoader.java:631)でjava.lang.ClassLoader.defineClass1(ネイティブメソッド)でPermGenスペース:615)... 8以上

1.8 JDK、-XX:プログラム上記MaxMetaspaceSize = 20メートルが再度実行され、結果がオーバーフローメタスペースとなります

java.lang.OutOfMemoryErrorを:net.sf.でnet.sf.cglib.proxy.Enhancer.generateでnet.sf.cglib.core.AbstractClassGenerator.generateでメタスペース(AbstractClassGenerator.java:345)(Enhancer.java:492) net.sf.cglib.proxy.Enhancer.createHelperでnet.sf.cglib.core.AbstractClassGenerator.createでcglib.core.AbstractClassGenerator $ ClassLoaderData.get(AbstractClassGenerator.java:114)(AbstractClassGenerator.java:291)(エンハンサー。 Javaの:480)com.meituan.waimai.jvm.JavaHeapSpaceDemo.mainでnet.sf.cglib.proxy.Enhancer.create(Enhancer.java:305)(JavaHeapSpaceDemo.java:36で)

ダイレクト・メモリ・ハンズ

JVM設定パラメータ、-XX:MaxDirectMemorySize = 8メートル、9Mおよびダイレクト・メモリ・アロケーション:

public class DirectMemoryDemo {
    public static void main(String[] args) {
        ByteBuffer byteBuffer = ByteBuffer.allocateDirect(9 * 1024 * 1024);
    }
}
复制代码

あなたは見ることができます

スレッド「メイン」java.lang.OutOfMemoryErrorを中に例外:java.nio.ByteBufferのでjava.nio.Bits.reserveMemory java.nio.DirectByteBufferで(Bits.java:694)(DirectByteBuffer.java:123)での直接バッファメモリcom.meituan.waimai.jvm.DirectMemoryDe​​mo.mainで.allocateDirect(ByteBuffer.java:311)(DirectMemoryDe​​mo.java:13)

ネイティブメソッドは、新しいネイティブスレッドを作成することができませんスタック

常にJavaスレッドを作成して、あなたはネイティブメソッドスタックを爆発することができます

public class NativeThreadDemo {
    public static void main(String[] args) {

        for (; ; ) {
            new Thread(()->{
                try {
                    TimeUnit.SECONDS.sleep(Integer.MAX_VALUE);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }).start();
        }
    }
}
复制代码

スレッドの例外「メイン」java.lang.OutOfMemoryErrorを:com.meituanでjava.lang.Thread.start(Thread.java:717)でjava.lang.Thread.start0(ネイティブメソッド)で新しいネイティブスレッドを作成することができません。 waimai.jvm.NativeThreadDemo.main(NativeThreadDemo.java:21)

プログラムをオフにするのを忘れて走り、その結果は、Macを再起動すると、非常に怖いとなります。ほとんどの非常に深い議論持つことが知られている新しいネイティブスレッド、作成することができない程度www.zhihu.com/question/64を...

おすすめ

転載: juejin.im/post/5d50db9ce51d453bc52315f4