成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

那些年,我們遇到的OOM

LeanCloud / 2835人閱讀

摘要:內(nèi)存模型先聊聊內(nèi)存模型,在網(wǎng)上找到一張有直接內(nèi)存的圖片,方便后面討論這張圖真是??闯P?,今天我們從內(nèi)存溢出的角度重新再審視一遍。

JVM內(nèi)存模型

先聊聊jvm內(nèi)存模型,在網(wǎng)上找到一張有直接內(nèi)存的圖片,方便后面討論

這張圖真是常看常新,今天我們從內(nèi)存溢出的角度重新再審視一遍。
方法區(qū),也稱(chēng)非堆,hotspot中,1.7叫perm區(qū),1.8叫元空間,因此這個(gè)區(qū)域溢出,1.7就是OutOfMemoryError: PermGen space,1.8是OutOfMemoryError: Metaspace

堆溢出比較常見(jiàn),OutOfMemoryError: Java heap space

虛擬機(jī)棧的溢出是 StackOverflowError

本地方法棧會(huì)出現(xiàn) java.lang.OutOfMemoryError : unable to create new native Thread

直接內(nèi)存會(huì)拋出 OutOfMemoryError: Direct buffer memory

以下將逐個(gè)撐爆這些空間

先來(lái)?yè)伪摂M機(jī)棧 StackOverflowError

不停地遞歸調(diào)用,jvm不得不在虛擬機(jī)棧上分配棧幀空間,從而導(dǎo)致sofe,感興趣的還可以查看一下遞歸的次數(shù),可能通過(guò)-Xss進(jìn)行配置,通過(guò)命令jinfo -flag ThreadStackSize [pid]可以查看??臻g大小的配置

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

    public static void main(String[] args) {
        test();
    }
}
再來(lái)?yè)伪寻?OutOfMemoryError: Java heap space

先指定-Xmx8m -Xms8m,然后直接在堆中生成一個(gè)8m字節(jié)的數(shù)組,可以直接看到效果

public class JavaHeapSpaceDemo {
    public static void main(String[] args) {
        byte[] bytes = new byte[8 * 1014 * 1024];
    }
}
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at com.meituan.waimai.jvm.JavaHeapSpaceDemo.main(JavaHeapSpaceDemo.java:11)
方法區(qū)有分說(shuō)

如果是1.7,會(huì)出現(xiàn)PemGen space, 這要求我們不斷往生成類(lèi)的信息。由于1.7,字符串常量池已經(jīng)挪到堆中了,所以使用String.intern()并不會(huì)導(dǎo)致perm區(qū)溢出

public class OOMDemo {
    public static void main(String[] args) {
        String str = "hello";
        List list = Lists.newArrayList();
        for (int i = 0; i < Integer.MAX_VALUE; i++) {
            str += (i + "").intern();
            list.add(str);
        }
    }
}
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:3332)
at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:124)
at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:448)
at java.lang.StringBuilder.append(StringBuilder.java:136)
at com.meituan.waimai.jvm.JavaHeapSpaceDemo.main(JavaHeapSpaceDemo.java:18)

那要怎么做呢,這里我們需要?jiǎng)討B(tài)地生成一些類(lèi),直到把perm區(qū)撐爆,jvm參數(shù)配置:-XX:MaxPermSize=8m

    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();
        }
    }
}
Caused by: java.lang.OutOfMemoryError: PermGen space
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
... 8 more

將jdk改為1.8,-XX:MaxMetaspaceSize=20m 重新執(zhí)行上述程序,結(jié)果變成Metaspace溢出

java.lang.OutOfMemoryError: Metaspace
at net.sf.cglib.core.AbstractClassGenerator.generate(AbstractClassGenerator.java:345)
at net.sf.cglib.proxy.Enhancer.generate(Enhancer.java:492)
at net.sf.cglib.core.AbstractClassGenerator$ClassLoaderData.get(AbstractClassGenerator.java:114)
at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:291)
at net.sf.cglib.proxy.Enhancer.createHelper(Enhancer.java:480)
at net.sf.cglib.proxy.Enhancer.create(Enhancer.java:305)
at com.meituan.waimai.jvm.JavaHeapSpaceDemo.main(JavaHeapSpaceDemo.java:36)
該對(duì)直接內(nèi)存動(dòng)手的

配置jvm參數(shù),-XX:MaxDirectMemorySize=8m,然后分配9m的直接內(nèi)存:

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

可以看到

Exception in thread "main" java.lang.OutOfMemoryError: Direct buffer memory
at java.nio.Bits.reserveMemory(Bits.java:694)
at java.nio.DirectByteBuffer.(DirectByteBuffer.java:123)
at java.nio.ByteBuffer.allocateDirect(ByteBuffer.java:311)
at com.meituan.waimai.jvm.DirectMemoryDemo.main(DirectMemoryDemo.java:13)
本地方法棧 unable to create new native Thread

不停地創(chuàng)建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();
        }
    }
}
Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native thread
at java.lang.Thread.start0(Native Method)
at java.lang.Thread.start(Thread.java:717)
at com.meituan.waimai.jvm.NativeThreadDemo.main(NativeThreadDemo.java:21)

這個(gè)程序跑完忘了關(guān),結(jié)果一會(huì)mac重啟了,非常可怕。。。。
關(guān)于unable to create new native Thread,知乎上有個(gè)非常深刻地討論
https://www.zhihu.com/questio...

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/76036.html

相關(guān)文章

  • 07.Android之多媒體問(wèn)題

    摘要:加載圖的機(jī)制是什么,為何不會(huì)內(nèi)存泄漏自定義可拖動(dòng)的顯示高清大圖的技術(shù)博客大總結(jié)提供一個(gè)設(shè)置圖片的入口,里面去獲得圖片的真實(shí)的寬度和高度,以及初始化我們的重寫(xiě),在里面根據(jù)用戶移動(dòng)的手勢(shì),去更新顯示區(qū)域的參數(shù)。 目錄介紹 7.0.0.1 加載bitmap圖片的時(shí)候需要注意什么?為何bitmap容易造成OOM?如何計(jì)算Bitmap占用內(nèi)存? 7.0.0.2 如何理解recycle釋放內(nèi)存問(wèn)...

    eechen 評(píng)論0 收藏0
  • 2016Java面試題整理

    摘要:和的區(qū)別來(lái)自類(lèi),和來(lái)自類(lèi)調(diào)用方法的過(guò)程中,線程不會(huì)釋放對(duì)象鎖。機(jī)制在使用迭代器的過(guò)程中有其他線程修改了,那么將拋出,這就是所謂機(jī)制。 面試是我們每個(gè)人都要經(jīng)歷的事情,大部分人且不止一次,這里給大家總結(jié)最新的2016年面試題,讓大家在找工作時(shí)候能夠事半功倍。 1 Switch能否用string做參數(shù)? a.在 Java 7 之前, switch 只能支持byte,short,char,i...

    tianren124 評(píng)論0 收藏0
  • 還在使用SimpleDateFormat?

    摘要:線程掛起,線程繼續(xù)走,還會(huì)被繼續(xù)使用方法,而這時(shí)用的是線程設(shè)置的值了,而這就是引發(fā)問(wèn)題的根源,出現(xiàn)時(shí)間不對(duì),線程掛死等等。建議為每個(gè)線程創(chuàng)建單獨(dú)的格式實(shí)例。其中工作隊(duì)列使用的是,源碼頭部的注釋中有說(shuō)明截取的部分。 閱讀本文大概需要 3.2 分鐘。 前言 日常開(kāi)發(fā)中,我們經(jīng)常需要使用時(shí)間相關(guān)類(lèi),想必大家對(duì)SimpleDateFormat并不陌生。主要是用它進(jìn)行時(shí)間的格式化輸出和解析,...

    LittleLiByte 評(píng)論0 收藏0
  • Bitmap避免OOM

    摘要:我知道最近世麟心情是錯(cuò)綜復(fù)雜,但還好的是絕大多數(shù)程序員都是特別有善心的。如果圖像數(shù)據(jù)較大就會(huì)造成對(duì)象申請(qǐng)的內(nèi)存較多,如果圖像過(guò)多就會(huì)造成內(nèi)存不夠用自然就會(huì)出現(xiàn)的現(xiàn)象。第二次將設(shè)置為再次調(diào)用函數(shù)時(shí)就能生成了。 目錄介紹 01.先看一個(gè)需求分析案例 02.Bitmap占用內(nèi)存介紹 03.影響B(tài)itmap占用內(nèi)存因素 04.圖像加載的方式 05.加載圖像內(nèi)存去哪里了 06.具體實(shí)現(xiàn)加載圖片...

    EastWoodYang 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<