欧美在线专区-欧美在线伊人-欧美在线一区二区三区欧美-欧美在线一区二区三区-pornodoxxx中国妞-pornodoldoo欧美另类

【性能優化】納尼?內存又溢出了?是時候總結一波了!

[導讀]這里,優化又溢我將在平時工作過程中總結的納尼內存內存溢出的情況,以代碼案例的候總形式直觀的分享給大家,希望能夠為小伙伴們帶來實質性的結波幫助。


【性能優化】納尼?內存又溢出了?是時候總結一波了!

案例介紹

這里,優化又溢我將在平時工作過程中總結的納尼內存內存溢出的情況,以代碼案例的候總形式直觀的分享給大家,希望能夠為小伙伴們帶來實質性的結波幫助。

接下來,優化又溢我們就以代碼案例的納尼內存形式來分析各種內存溢出的情況。

定義主類結構

首先,候總我們創建一個類叫做BlowUpJVM,結波所有的優化又溢案例實驗都是基于這個類進行。

public?class?BlowUpJVM?{ ??
}?

棧深度溢出

public?static?void??testStackOverFlow(){ ?
??????BlowUpJVM.testStackOverFlow();?
}?

棧不斷遞歸,納尼內存而且沒有處理,候總所以虛擬機棧就不斷深入不斷深入,棧深度就這樣溢出了。

永久代內存溢出

public?static?void?testPergemOutOfMemory1(){ ?
???//方法一失敗?
????List?list?=?new?ArrayList();?
?
???while(true){ ?
??????list.add(UUID.randomUUID().toString().intern());?
???}?
}?

打算把String常量池堆滿,沒想到失敗了,JDK1.7后常量池放到了堆里,也能進行垃圾回收了。

然后換種方式,使用cglib,用Class把老年代取堆滿

public?static?void?testPergemOutOfMemory2(){ ?
???try?{ ?
??????while?(true)?{ ?
?????????Enhancer?enhancer?=?new?Enhancer();?
?????????enhancer.setSuperclass(OOM.class);?
?????????enhancer.setUseCache(false);?
?????????enhancer.setCallback(new?MethodInterceptor()?{ ?
????????????@Override?
????????????public?Object?intercept(Object?obj,?Method?method,?Object[]?args,?MethodProxy?proxy)?throws?Throwable?{ ?
???????????????return?proxy.invokeSuper(obj,?args);?
????????????}?
?????????});?
?????????enhancer.create();?
??????}?
???}?
???catch?(Exception?e){ ?
??????e.printStackTrace();?
???}?
}?

虛擬機成功內存溢出了,那JDK動態代理產生的類能不能溢出呢?

public?static?void?testPergemOutOfMemory3(){ ?
???while(true){ ?
???final?OOM?oom?=?new?OOM();?
???Proxy.newProxyInstance(oom.getClass().getClassLoader(),?oom.getClass().getInterfaces(),?new?InvocationHandler()?{ ?
?????????public?Object?invoke(Object?proxy,?Method?method,?Object[]?args)?throws?Throwable?{ ?
????????????Object?result?=?method.invoke(oom,?args);?
????????????return?result;?
?????????}?
??????});?
???}?
}?

事實表明,JDK動態代理差生的類不會造成內存溢出,原因是:JDK動態代理產生的類信息,不會放到永久代中,而是放在堆中。

本地方法棧溢出

public?static?void?testNativeMethodOutOfMemory(){ ?
???int?j?=?0;?
???while(true){ ?
??????Printer.println(j++);?
??????ExecutorService?executors?=?Executors.newFixedThreadPool(50);?
??????int?i=0;?
??????while(i++<10){ ?
?????????executors.submit(new?Runnable()?{ ?
????????????public?void?run()?{ ?
????????????}?
?????????});?
??????}?
???}?
}?

這個的原理就是不斷創建線程池,而每個線程池都創建10個線程,這些線程池都是在本地方法區的,久而久之,本地方法區就溢出了。

JVM棧內存溢出

public?static?void?testStackOutOfMemory(){ ?
????while?(true)?{ ???
????????????Thread?thread?=?new?Thread(new?Runnable()?{ ???
???????????????????public?void?run()?{ ?
??????????????????????????while(true){ ?
??????????????????????}?
???????????????????}???
????????????});???
????????????thread.start();???
?????}???
}?

線程的創建會直接在JVM棧中創建,但是本例子中,沒看到內存溢出,主機先掛了,不是JVM掛了,真的是主機掛了,無論在mac還是在windows,都掛了。

溫馨提示,這個真的會死機的。

堆溢出

public?static?void?testOutOfHeapMemory(){ ?
???List?list?=?new?ArrayList();?
???while(true){ ?
??????StringBuffer?B?=?new?StringBuffer();?
??????for(int?i?=?0?;?i??????????B.append(i);?
??????}?
??????list.add(B);?
???}?
}?

不斷往堆中塞新增的StringBuffer對象,堆滿了就直接溢出了。

特別推薦一個分享架構+算法的優質內容,還沒關注的小伙伴,可以長按關注一下:

長按訂閱更多精彩▼

如有收獲,點個在看,誠摯感謝

免責聲明:本文內容由21ic獲得授權后發布,版權歸原作者所有,本平臺僅提供信息存儲服務。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯系我們,謝謝!

Popular articles

主站蜘蛛池模板: 人和与禽交| 中文字幕在线视频在线看| 成人欧美一区二区三区的电影| 免费啪啪社区免费啪啪手机版| 香港三级电影免费看| 久久精品国产欧美日韩| 啦啦啦手机完整免费高清观看| 欧美巨大bbbb| loveme动漫在线观看免费| 欧美怡红院免费全视频| 成人韩免费网站| 又大又硬又黄又刺激的免费视频| 91视频久久久久| 又粗又大又爽又长又紧又水| 国产卡1卡2卡三卡在线| 一级毛片免费毛片毛片| 国产在线视频一区二区三区| 亚洲国产欧美日韩精品一区二区三区| 中文字幕无线码中文字幕免费| 2018国产大陆天天弄| 人人超人人97超人人女| 欧美中文字幕在线看| 老师你好电影高清完整版在线观看 | 国产猛男猛女超爽免费视频| 嘟嘟嘟www在线观看免费高清| 狠狠色综合网站久久久久久久| 涩涩爱影院| 又黄又爽的视频在线观看| 里番acg全彩本子| 天天拍拍夜夜出水| 天天天天做夜夜夜做| 天天做日日做| 男女下面一进一出无遮挡se| 国产精品9999久久久久仙踪林| 日本阿v视频在线观看高清| 一级艳片加勒比女海盗1| 免费一级毛片在级播放| 欧美激情第1页| 亚洲国产欧洲综合997久久| 亚洲成a人片在线观| 把她抵在洗手台挺进撞击视频|