日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

JVM優(yōu)化:實戰(zhàn)OutOfMemoryError異常

來源: 責編: 時間:2023-08-05 11:46:16 4761觀看
導讀一、Java堆溢出堆內(nèi)存中主要存放對象、數(shù)組等,只要不斷地創(chuàng)建這些對象,并且保證 GC Roots 到對象之間有可達路徑來避免垃 圾收集回收機制清除這些對象,當這些對象所占空間超過最大堆容量時,就會產(chǎn)生 OutOfMemoryError 的

一、Java堆溢出

堆內(nèi)存中主要存放對象、數(shù)組等,只要不斷地創(chuàng)建這些對象,并且保證 GC Roots 到對象之間有可達路徑來避免垃 圾收集回收機制清除這些對象,當這些對象所占空間超過最大堆容量時,就會產(chǎn)生 OutOfMemoryError 的異常。堆 內(nèi)存異常示例如下:C2R28資訊網(wǎng)——每日最新資訊28at.com

C2R28資訊網(wǎng)——每日最新資訊28at.com

運行后會報異常,在堆棧信息中可以看到C2R28資訊網(wǎng)——每日最新資訊28at.com

java.lang.OutOfMemoryError: Java heap space 的信息,說明在堆內(nèi)存空間產(chǎn)生內(nèi)存溢出的異常。C2R28資訊網(wǎng)——每日最新資訊28at.com

新產(chǎn)生的對象最初分配在新生代,新生代滿后會進行一次 Minor GC ,如果 Minor GC 后空間不足會把該對象和 新生代滿足條件的對象放入老年代,老年代空間不足時會進行 Full GC ,之后如果空間還不足以存放新對象則拋 出 OutOfMemoryError 異常。C2R28資訊網(wǎng)——每日最新資訊28at.com

常見原因:C2R28資訊網(wǎng)——每日最新資訊28at.com

  •  內(nèi)存中加載的數(shù)據(jù)過多,如一次從數(shù)據(jù)庫中取出過多數(shù)據(jù);
  • 集合對對象引用過多且使用完后沒有清空;
  • 代碼中存在死循環(huán)或循環(huán)產(chǎn)生過多重復(fù)對象;
  • 堆內(nèi)存分配不合理

二、虛擬機棧和本地方法棧溢出

由于HotSpot虛擬機中并不區(qū)分虛擬機棧和本地方法棧, 因此對于HotSpot來說, -Xoss參數(shù)(設(shè)置本地方法棧大 小) 雖然存在, 但實際上是沒有任何效果的, 棧容量只能由-Xss參數(shù)來設(shè)定。 關(guān)于虛擬機棧和本地方法棧, 在 《Java虛擬機規(guī)范》 中描述了兩種異常:C2R28資訊網(wǎng)——每日最新資訊28at.com

1) 如果線程請求的棧深度大于虛擬機所允許的最大深度, 將拋出StackOverflowError異常。C2R28資訊網(wǎng)——每日最新資訊28at.com

2) 如果虛擬機的棧內(nèi)存允許動態(tài)擴展, 當擴展棧容量無法申請到足夠的內(nèi)存時, 將拋出 OutOfMemoryError異 常。C2R28資訊網(wǎng)——每日最新資訊28at.com

《Java虛擬機規(guī)范》 明確允許Java虛擬機實現(xiàn)自行選擇是否支持棧的動態(tài)擴展, 而HotSpot虛擬機的選擇是不支持 擴展, 所以除非在創(chuàng)建線程申請內(nèi)存時就因無法獲得足夠內(nèi)存而出現(xiàn) OutOfMemoryError異常, 否則在線程運行時 是不會因為擴展而導致內(nèi)存溢出的, 只會因為棧容量無法容納新的棧幀而導致StackOverflowError異常。C2R28資訊網(wǎng)——每日最新資訊28at.com

為了驗證 這點, 我們可以做兩個實驗, 先將實驗范圍限制在單線程中操作, 嘗試下面兩種行為是 否能讓HotSpot虛擬機產(chǎn) 生OutOfMemoryError異常: 使用-Xss參數(shù)減少棧內(nèi)存容量。 結(jié)果: 拋出StackOverflowError異常, 異常出現(xiàn)時輸出 的堆棧深度相應(yīng)縮小。 定義了大量的本地變量, 增大此方法幀中本地變量表的長度。 結(jié)果: 拋出 StackOverflowError異常, 異常出現(xiàn)時輸出的堆棧深度相應(yīng)縮小。C2R28資訊網(wǎng)——每日最新資訊28at.com

三、 運行時常量池和方法區(qū)溢出

由于運行時常量池是方法區(qū)的一部分, 所以這兩個區(qū)域的溢出測試可以放到一起進行。前面曾經(jīng)提到HotSpot從 JDK 7開始逐步“去永久代”的計劃, 并在JDK 8中完全使用元空間來代替永久代的背景故事, 在此我們就以測試代碼 來觀察一下, 使用“永久代”還是“元空間”來實現(xiàn)方法區(qū), 對程序有什么 實際的影響。C2R28資訊網(wǎng)——每日最新資訊28at.com

String::intern()是一個本地方法, 它的作用是如果字符串常量池中已經(jīng)包含一個等于此String對象的 字符串, 則返 回代表池中這個字符串的String對象的引用; 否則, 會將此String對象包含的字符串添加到常量池中, 并且返回此 String對象的引用。 在JDK 6或更早之前的HotSpot虛擬機中, 常量池都是分配在永久代中, 我們可以通過-XX: PermSize和-XX: MaxPermSize限制永久代的大小, 即可間接限制其中常量池的容量。C2R28資訊網(wǎng)——每日最新資訊28at.com

方法區(qū)內(nèi)存溢出

方法區(qū)的其他部分的內(nèi)容, 方法區(qū)的主要職責是用于存放類型的相關(guān)信息, 如類名、 訪問修飾符、 常量池、 字段 描述、 方法描述等。 對于這部分區(qū)域的測試, 基本的思路是運行時產(chǎn)生大量的類去填滿方法區(qū), 直到溢出為止。C2R28資訊網(wǎng)——每日最新資訊28at.com

四、直接內(nèi)存溢出

直接內(nèi)存(Direct Memory) 的容量大小可通過-XX: MaxDirectMemorySize參數(shù)來指定, 如果不去指定, 則默認與 Java堆最大值(由-Xmx指定) 一致, 越過了DirectByteBuer類直接通 過反射獲取Unsafe實例進行內(nèi)存分配 (Unsafe類的getUnsafe()方法指定只有引導類加載器才會返回實例, 體現(xiàn)了設(shè)計者希望只有虛擬機標準類庫里面的 類才能使用Unsafe的功能,在JDK 10時才將Unsafe 的部分功能通過VarHandle開放給外部使用) ,C2R28資訊網(wǎng)——每日最新資訊28at.com

因為雖然使用 DirectByteBuer分配內(nèi)存也會拋出內(nèi)存溢出異常, 但它拋出異常時并沒有真正向操作系統(tǒng)申請分配內(nèi)存, 而是通 過計算得知內(nèi)存無法分配就會 在代碼里手動拋出溢出異常, 真正申請分配內(nèi)存的方法是Unsafe::allocateMemory()。C2R28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-151-0.htmlJVM優(yōu)化:實戰(zhàn)OutOfMemoryError異常

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 一文搞定Java NIO,以及各種奇葩流

下一篇: 為什么你不應(yīng)該使用Div作為可點擊元素

標簽:
  • 熱門焦點
  • 紅魔電競平板評測:大屏幕硬實力

    前言:三年的疫情因為要上網(wǎng)課的原因激活了平板市場,如今網(wǎng)課的時代已經(jīng)過去,大家的生活都恢復(fù)到了正軌,這也就意味著,真正考驗平板電腦生存的環(huán)境來了。也就是面對著這種殘酷的
  • 石頭智能洗地機A10 Plus體驗:雙向自清潔治好了我的懶癌

    一、前言和介紹專為家庭請假懶人而生的石頭科技在近日又帶來了自己的全新旗艦新品,石頭智能洗地機A10 Plus。從這個產(chǎn)品名上就不難看出,這次石頭推出的并不是常見的掃地機器
  • 摸魚心法第一章——和配置文件說拜拜

    為了能摸魚我們團隊做了容器化,但是帶來的問題是服務(wù)配置文件很麻煩,然后大家在群里進行了“親切友好”的溝通圖片圖片圖片圖片對比就對比,簡單對比下獨立配置中心和k8s作為配
  • 分享六款相見恨晚的PPT模版網(wǎng)站, 祝你做出精美的PPT!

    1、OfficePLUSOfficePLUS網(wǎng)站旨在為全球Office用戶提供豐富的高品質(zhì)原創(chuàng)PPT模板、實用文檔、數(shù)據(jù)圖表及個性化定制服務(wù)。優(yōu)點:OfficePLUS是微軟官方網(wǎng)站,囊括PPT模板、Word模
  • 為什么你不應(yīng)該使用Div作為可點擊元素

    按鈕是為任何網(wǎng)絡(luò)應(yīng)用程序提供交互性的最常見方式。但我們經(jīng)常傾向于使用其他HTML元素,如 div span 等作為 clickable 元素。但通過這樣做,我們錯過了許多內(nèi)置瀏覽器的功能。
  • 共享單車的故事講到哪了?

    來源丨海克財經(jīng)與共享充電寶相差不多,共享單車已很久沒有被國內(nèi)熱點新聞關(guān)照到了。除了一再漲價和用戶直呼用不起了。近日多家媒體再發(fā)報道稱,成都、天津、鄭州等地多個共享單
  • ESG的面子與里子

    來源 | 光子星球撰文 | 吳坤諺編輯 | 吳先之三伏大幕拉起,各地高溫預(yù)警不絕,但處于厄爾尼諾大“烤”之下的除了眾生,還有各大企業(yè)發(fā)布的ESG報告。ESG是“環(huán)境保
  • 蘋果公司要求三星和LG Display生產(chǎn)「無邊框」OLED iPhone顯示屏

    據(jù) The Elec 報道,蘋果已要求其供應(yīng)商為未來的 iPhone 型號開發(fā)「無邊框」OLED 顯示面板。蘋果顯然已要求三星和 LG Display 開發(fā)新的 OLED 顯示面
  • 2022爆款:ROG魔霸6 冰川散熱系統(tǒng)持續(xù)護航

    喜逢開學季,各大商家開始推出自己的新產(chǎn)品,進行打折促銷活動。對于忠實的端游愛好者來說,能夠擁有一款夢寐以求的筆記本電腦是一件十分開心的事。但是現(xiàn)在的
Top 主站蜘蛛池模板: 高清| 五寨县| 平湖市| 乌拉特前旗| 加查县| 凌源市| 阿鲁科尔沁旗| 龙游县| 屯留县| 新和县| 罗城| 崇阳县| 石台县| 洛隆县| 温泉县| 浦江县| 凤凰县| 高雄县| 集安市| 新化县| 红河县| 佛教| 库车县| 安顺市| 东方市| 宜昌市| 南召县| 蓬安县| 庆云县| 邓州市| 新乐市| 岳普湖县| 晴隆县| 太湖县| 历史| 长岛县| 志丹县| 包头市| 平昌县| 陇南市| 诸城市|