www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁(yè) > 公眾號(hào)精選 > 架構(gòu)師社區(qū)
[導(dǎo)讀]這個(gè)面試題是一個(gè)朋友在面試的時(shí)候碰到的,什么時(shí)候會(huì)拋出OutOfMemery異常呢?初看好像挺簡(jiǎn)單的,其實(shí)深究起來(lái)考察的是對(duì)整個(gè)JVM的了解,而且這個(gè)問(wèn)題從網(wǎng)上可以翻到一些亂七八糟的答案,其實(shí)在總結(jié)下來(lái)基本上4個(gè)場(chǎng)景可以概括下來(lái)。

這個(gè)面試題是一個(gè)朋友在面試的時(shí)候碰到的,什么時(shí)候會(huì)拋出OutOfMemery異常呢?初看好像挺簡(jiǎn)單的,其實(shí)深究起來(lái)考察的是對(duì)整個(gè)JVM的了解,而且這個(gè)問(wèn)題從網(wǎng)上可以翻到一些亂七八糟的答案,其實(shí)在總結(jié)下來(lái)基本上4個(gè)場(chǎng)景可以概括下來(lái)。

堆內(nèi)存溢出

堆內(nèi)存溢出太常見(jiàn),大部分人都應(yīng)該能想得到這一點(diǎn),堆內(nèi)存用來(lái)存儲(chǔ)對(duì)象實(shí)例,我們只要不停的創(chuàng)建對(duì)象,并且保證GC Roots和對(duì)象之間有可達(dá)路徑避免垃圾回收,那么在對(duì)象數(shù)量超過(guò)最大堆的大小限制后很快就能出現(xiàn)這個(gè)異常。

寫(xiě)一段代碼測(cè)試一下,設(shè)置堆內(nèi)存大小2M。

面試官:哪些場(chǎng)景會(huì)產(chǎn)生OOM?怎么解決?
public class HeapOOM { public static void main(String[]?args) {
????????Listlist?= new ArrayList<>(); while (true)?{
????????????list.add(new HeapOOM());
????????}
????}
}

運(yùn)行代碼,很快能看見(jiàn)OOM異常出現(xiàn),這里的提示是Java heap space堆內(nèi)存溢出。

面試官:哪些場(chǎng)景會(huì)產(chǎn)生OOM?怎么解決?

一般的排查方式可以通過(guò)設(shè)置-XX: +HeapDumpOnOutOfMemoryError在發(fā)生異常時(shí)dump出當(dāng)前的內(nèi)存轉(zhuǎn)儲(chǔ)快照來(lái)分析,分析可以使用Eclipse Memory Analyzer(MAT)來(lái)分析,獨(dú)立文件可以在官網(wǎng)下載。

另外如果使用的是IDEA的話(huà),可以使用商業(yè)版JProfiler或者開(kāi)源版本的JVM-Profiler,此外IDEA2018版本之后內(nèi)置了分析工具,包括Flame Graph(火焰圖)和Call Tree(調(diào)用樹(shù))功能。

面試官:哪些場(chǎng)景會(huì)產(chǎn)生OOM?怎么解決? 面試官:哪些場(chǎng)景會(huì)產(chǎn)生OOM?怎么解決? 火焰圖

方法區(qū)(運(yùn)行時(shí)常量池)和元空間溢出

方法區(qū)和堆一樣,是線(xiàn)程共享的區(qū)域,包含Class文件信息、運(yùn)行時(shí)常量池、常量池,運(yùn)行時(shí)常量池和常量池的主要區(qū)別是具備動(dòng)態(tài)性,也就是不一定非要是在Class文件中的常量池中的內(nèi)容才能進(jìn)入運(yùn)行時(shí)常量池,運(yùn)行期間也可以可以將新的常量放入池中,比如String的intern()方法。

我們寫(xiě)一段代碼驗(yàn)證一下String.intern(),同時(shí)我們?cè)O(shè)置-XX:MetaspaceSize=50m -XX:MaxMetaspaceSize=50m 元空間大小。由于我使用的是1.8版本的JDK,而1.8版本之前方法區(qū)存在于永久代(PermGen),1.8之后取消了永久代的概念,轉(zhuǎn)為元空間(Metaspace),如果是之前版本可以設(shè)置PermSize MaxPermSize永久代的大小。

private static String?str?= "test"; public static void main(String[]?args) {
????????Listlist?= new ArrayList<>(); while (true){
????????????String?str2?=?str?+?str;
????????????str?=?str2;
????????????list.add(str.intern());
????????}
}

運(yùn)行代碼,會(huì)發(fā)現(xiàn)代碼報(bào)錯(cuò)。

面試官:哪些場(chǎng)景會(huì)產(chǎn)生OOM?怎么解決?

再次修改配置,去除元空間限制,修改堆內(nèi)存大小-Xms20m -Xmx20m,可以看見(jiàn)堆內(nèi)存報(bào)錯(cuò)。

面試官:哪些場(chǎng)景會(huì)產(chǎn)生OOM?怎么解決?

這是為什么呢?intern()本身是一個(gè)native方法,它的作用是:如果字符串常量池中已經(jīng)包含一個(gè)等 于此String對(duì)象的字符串,則返回代表池中這個(gè)字符串的String對(duì)象;否則,將此String對(duì)象包含的字符串添加到常量池中,并且返回String對(duì)象的引用。

而在1.7版本之后,字符串常量池已經(jīng)轉(zhuǎn)移到堆區(qū),所以會(huì)報(bào)出堆內(nèi)存溢出的錯(cuò)誤,如果1.7之前版本的話(huà)會(huì)看見(jiàn)PermGen space的報(bào)錯(cuò)。

直接內(nèi)存溢出

直接內(nèi)存并不是虛擬機(jī)運(yùn)行時(shí)數(shù)據(jù)區(qū)域的一部分,并且不受堆內(nèi)存的限制,但是受到機(jī)器內(nèi)存大小的限制。常見(jiàn)的比如在NIO中可以使用native函數(shù)直接分配堆外內(nèi)存就容易導(dǎo)致OOM的問(wèn)題。

直接內(nèi)存大小可以通過(guò)-XX:MaxDirectMemorySize指定,如果不指定,則默認(rèn)與Java 堆最大值-Xmx一樣。

由直接內(nèi)存導(dǎo)致的內(nèi)存溢出,一個(gè)明顯的特征是在Dump文件中不會(huì)看見(jiàn)明顯的異常,如果發(fā)現(xiàn)OOM之后Dump文件很小,而程序中又直接或間接使用了NIO,那就可以考慮檢查一下是不是這方面的原因。

棧內(nèi)存溢出

棧是線(xiàn)程私有,它的生命周期和線(xiàn)程相同。每個(gè)方法在執(zhí)行的同時(shí)都會(huì)創(chuàng)建一個(gè)棧幀用于存儲(chǔ)局部變量表、操作數(shù)棧、動(dòng)態(tài)鏈接、方法出口等信息,方法調(diào)用的過(guò)程就是棧幀入棧和出棧的過(guò)程。

在java虛擬機(jī)規(guī)范中,對(duì)虛擬機(jī)棧定義了兩種異常:

  1. 如果線(xiàn)程請(qǐng)求的棧深度大于虛擬機(jī)所允許的深度,將拋出StackOverflowError異常
  2. 如果虛擬機(jī)??梢詣?dòng)態(tài)擴(kuò)展,并且擴(kuò)展時(shí)無(wú)法申請(qǐng)到足夠的內(nèi)存,拋出OutOfMemoryError異常

先寫(xiě)一段代碼測(cè)試一下,設(shè)置-Xss160k,-Xss代表每個(gè)線(xiàn)程的棧內(nèi)存大小

public class StackOOM { private int length?= 1; public void stackTest() {
????????System.out.println("stack?lenght=" +?length);
????????length++;
????????stackTest();
????} public static void main(String[]?args) {
????????StackOOM?test?= new StackOOM();
????????test.stackTest();
????}
}

測(cè)試發(fā)現(xiàn),單線(xiàn)程下無(wú)論怎么設(shè)置參數(shù)都是StackOverflow異常。

面試官:哪些場(chǎng)景會(huì)產(chǎn)生OOM?怎么解決?

嘗試把代碼修改為多線(xiàn)程,調(diào)整-Xss2m,因?yàn)闉槊總€(gè)線(xiàn)程分配的內(nèi)存越大,棧空間可容納的線(xiàn)程數(shù)量越少,越容易產(chǎn)生內(nèi)存溢出。反之,如果內(nèi)存不夠的情況,可以調(diào)小該參數(shù)來(lái)達(dá)到支撐更多線(xiàn)程的目的。

public class StackOOM { private void dontStop() { while (true)?{
????????}
????} public void stackLeakByThread() { while (true)?{ new Thread(()?->?dontStop()).start();
????????}
????} public static void main(String[]?args) throws Throwable {
????????StackOOM?stackOOM?= new StackOOM();
????????stackOOM.stackLeakByThread();
????}
}


免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀(guān)點(diǎn),不代表本平臺(tái)立場(chǎng),如有問(wèn)題,請(qǐng)聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀(guān)點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專(zhuān)欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車(chē)的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車(chē)技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車(chē)工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車(chē)。 SODA V工具的開(kāi)發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車(chē) 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶(hù)希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開(kāi)幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱(chēng),數(shù)字世界的話(huà)語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱(chēng)"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉