JAVA | 聚焦 OutOfMemoryError 異常

個人主頁
文章專欄

在這里插入圖片描述

在正文開始前,我想多說幾句,也就是吐苦水吧…最近這段時間一直想寫點東西,停下來反思思考一下。

心中萬言,真正執筆時又不知先寫些什么。通常這個時候,我都會隨便寫寫,文風極像散文,形散意不散吧!

先說一下近況,最近參加了Mathorlab數學建模,作為一個大一的學生,第一次參加那么高強度的競賽。深深的意識到自己的不足,天之大,不過蚍蜉撼樹。我不過是渺小的滄海一粟。竟欲與蒼天比高,不自量力、癡人說夢。夢醒了,還是得加油干…高考后,天真的以為自己不用學習了,后來發現,自己一輩子都要學習。害,挺難過的,也挺無助的。

我,出現在這里。可能你們以為我是理科生,工科女…哦不!我江蘇高考純文出身,這像極了案底。高二下之前,我的確是根正苗紅的物化生。可惜,爾輩不能究物理。我無比后悔當時的決定,可是人是不會滿足的,那時候不管學啥,我都會后悔。用現在的眼光,去埋怨當時的自己。這像極了霸凌…

我本科財務管理專業,但是我偏離了軌道。去學了計算機…午夜夢回,總會覺著自己可笑。一個文科生,還不是很好的大學,去學了計算機…很瘋狂!看到這兒,你可能會笑話我…太不自量力了!但是,哎!

其實,當我步入大學沒多久我就意識到這個軌道的盡頭是什么。

如果你問我讀書的意義是什么?上年這個時候,我可能還會說:為天地立心,為生民立命…多么正氣,多么理想化!但是,現在我只想以后我有能力養活自己。

唉,我也不知道我的選擇是不是正確的。我也不知道,我未來的我怎么去看待這個選擇,越想越內耗。

我和我朋友說,我考研要考南京郵電大學…我也不知道未來怎么樣,這是19歲的我選擇的最適合我的出路了。反正認準了就好好去努力吧。就算錯了,從頭再來就是了。我才不過19歲,我最大的優勢就是年輕…

共勉吧!

文章目錄

    • 一、Java 堆溢出
      • 原理
      • 示例代碼
      • 解決思路
    • 二、虛擬機棧和本地方法棧溢出
      • 原理
      • 示例代碼
      • 解決思路
    • 三、方法區和運行時常量池溢出
      • 原理
      • 示例代碼
      • 解決思路
    • 四、直接內存溢出
      • 原理
      • 示例代碼

在 Java 開發中,內存溢出異常是影響程序穩定性的關鍵問題。了解其原理和應對方法,對開發者至關重要。

一、Java 堆溢出

原理

Java 堆用于存儲對象實例。不斷創建對象,且阻止垃圾回收器回收,對象數量超出堆容量時,就會引發堆溢出。

示例代碼

// VM Args: -Xmx20m -Xms20m -XX:+HeapDumpOnOutOfMemoryError
public class HeapOOM {static class OOMObject {}public static void main(String[] args) {List<OOMObject> list = new ArrayList<>();while (true) {list.add(new OOMObject());}}
}

解決思路

  • 利用內存映像分析工具(如 Eclipse Memory Analyzer )分析堆轉儲快照。
  • 區分內存泄漏和內存溢出:若存在無用對象長期占用內存,是內存泄漏;若對象都有用但堆空間不足,可調整堆參數(-Xmx 與 - Xms ),并優化代碼減少內存占用。

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

原理

  • 線程請求棧深度超虛擬機允許值,拋出StackOverflowError
  • 虛擬機棧若支持動態擴展,擴展時內存申請失敗,拋出OutOfMemoryError (HotSpot 不支持棧動態擴展 )。

示例代碼

  • 測試StackOverflowError
// VM Args: -Xss128k
public class JavaVMStackSOF {private int stackLength = 1;public void stackLeak() {stackLength++;stackLeak();}public static void main(String[] args) throws Throwable {JavaVMStackSOF oom = new JavaVMStackSOF();try {oom.stackLeak();} catch (Exception e) {System.out.println("stack length:" + oom.stackLength);throw e;}}
}
  • 測試大量線程導致內存溢出
// VM Args: -Xss2M
public class JavaVMStackOOM {private void dontStop() {while (true) {}}public void stackLeakByThread() {while (true) {Thread thread = new Thread(() -> dontStop());thread.start();}}public static void main(String[] args) throws Throwable {JavaVMStackOOM oom = new JavaVMStackOOM();oom.stackLeakByThread();}
}

解決思路

  • 出現StackOverflowError 時,可根據錯誤堆棧分析遞歸調用等問題代碼。
  • 對于大量線程導致的內存溢出,可減少線程數量、調整棧內存大小(-Xss ),或升級 64 位虛擬機以獲取更多內存。

三、方法區和運行時常量池溢出

原理

  • 方法區存儲類信息、常量池等。運行時動態生成大量類(如使用 CGLib ),會耗盡方法區空間。
  • 運行時常量池是方法區一部分,字符串操作(如String.intern() )不當,可能導致常量池溢出。

示例代碼

  • 方法區溢出測試(借助 CGLib )
// VM Args: -XX:PermSize=10M -XX:MaxPermSize=10M
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
public class JavaMethodAreaOOM {static class OOMObject {}public static void main(String[] args) {while (true) {Enhancer enhancer = new Enhancer();enhancer.setSuperclass(OOMObject.class);enhancer.setUseCache(false);enhancer.setCallback(new MethodInterceptor() {@Overridepublic Object intercept(Object obj, java.lang.reflect.Method method, Object[] args, MethodProxy proxy) throws Throwable {return proxy.invokeSuper(obj, args);}});enhancer.create();}}
}
  • 運行時常量池溢出測試(String.intern()
// JDK 6 運行:-XX:PermSize=6M -XX:MaxPermSize=6M
// JDK 7及以上運行:-Xmx6M
public class RuntimeConstantPoolOOM {public static void main(String[] args) {String str1 = new StringBuilder("計算機").append("軟件").toString();System.out.println(str1.intern() == str1); String str2 = new StringBuilder("ja").append("va").toString();System.out.println(str2.intern() == str2); }
}

解決思路

  • 方法區溢出時,調整方法區相關參數(如 JDK 8 前的 - XX:PermSize 和 - XX:MaxPermSize ,JDK 8 及以后的 - XX:MetaspaceSize 等 ),優化代碼減少動態類生成。
  • 針對常量池溢出,合理使用String.intern() 方法,避免無意義的字符串入池操作。

四、直接內存溢出

原理

直接內存容量由-XX:MaxDirectMemorySize 參數控制,默認與 Java 堆最大值相同。直接或間接使用DirectByteBufferUnsafe 等分配內存超出限制,會引發溢出。

示例代碼

// VM Args: -Xmx20M -XX:MaxDirectMemorySize=10M
import sun.misc.Unsafe;
import java.lang.reflect.Field;
public class DirectMemoryOOM {private static final int _1MB = 1024 * 1024;public static void main(String[] args) throws Exception {Field unsafeField = Unsafe.class.getDeclaredFields()[0];unsafeField.setAccessible(true);Unsafe unsafe = (Unsafe) unsafeField.get(null);while (true) {unsafe.allocateMemory(_1MB);}}
}

解決思路

  • 合理設置-XX:MaxDirectMemorySize 參數。
  • 排查代碼中直接內存分配操作,如 NIO 相關代碼,確保內存分配合理。

ld.get(null);
while (true) {
unsafe.allocateMemory(_1MB);
}
}
}


解決思路- 合理設置`-XX:MaxDirectMemorySize` 參數。
- 排查代碼中直接內存分配操作,如 NIO 相關代碼,確保內存分配合理。通過深入理解 Java 內存溢出異常原理,結合具體代碼示例和解決思路,開發者能更好地定位和解決內存問題,保障 Java 程序穩定運行。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/80724.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/80724.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/80724.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于開源技術體系的品牌賽道力重構:AI智能名片與S2B2C商城小程序源碼驅動的品類創新機制研究

摘要&#xff1a;在數字經濟與實體經濟深度融合的背景下&#xff0c;品牌競爭已從單一產品力競爭轉向生態化、技術化的賽道力競爭。本文以開源AI大模型、AI智能名片及S2B2C商城小程序源碼為核心技術載體&#xff0c;構建"技術賦能-場景貫通-生態協同"三維分析框架&am…

【vue3】購物車實戰:從狀態管理到用戶體驗的全流程實現

在電商項目中&#xff0c;購物車是核心功能之一&#xff0c;需要兼顧數據一致性、用戶體驗和邏輯復雜度。 本文結合 Vue3 Pinia 技術棧&#xff0c;詳細講解如何實現一個高效且易用的購物車系統&#xff0c;重點剖析 添加購物車 和 頭部購物車預覽 的核心邏輯與實現細節。 一…

卡洛詩西餐廳,以“中式西餐”為核心戰略

在餐飲市場的激烈競爭中&#xff0c;“本土化”是許多國際餐飲品牌難以跨越的鴻溝——要么因水土不服黯然退場&#xff0c;要么因過度妥協失去特色。然而&#xff0c;卡洛詩以“中式西餐”為核心戰略&#xff0c;將西餐與國內飲食文化深度融合&#xff0c;不僅破解了西餐本土化…

28-29【動手學深度學習】批量歸一化 + ResNet

1. 批量歸一化 1.1 原理 當神經網絡比較深的時候會發現&#xff1a;數據在下面&#xff0c;損失函數在上面&#xff0c;這樣會出現什么問題&#xff1f; 正向傳遞的時候&#xff0c;數據是從下往上一步一步往上傳遞反向傳遞的時候&#xff0c;數據是從上面往下傳遞&#xff0…

【Linux網絡】Http服務優化 - 增加請求后綴、狀態碼描述、重定向、自動跳轉及注冊多功能服務

&#x1f4e2;博客主頁&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;博客倉庫&#xff1a;https://gitee.com/JohnKingW/linux_test/tree/master/lesson &#x1f4e2;歡迎點贊 &#x1f44d; 收藏 ?留言 &#x1f4dd; 如有錯誤敬請指正&#xff01; &…

AIGC(生成式AI)試用 32 -- AI做軟件程序測試 3

總結之前的AI做程序測試過程&#xff0c;試圖優化提問方式&#xff0c;整合完成的AI程序測試提問&#xff0c;探索更多可能的AI測試 AIGC&#xff08;生成式AI&#xff09;試用 30 -- AI做軟件程序測試 1 AIGC&#xff08;生成式AI&#xff09;試用 31 -- AI做軟件程序…

C語言實現迪杰斯特拉算法進行路徑規劃

使用C語言實現迪杰斯特拉算法進行路徑規劃 迪杰斯特拉算法是一種用于尋找加權圖中最短路徑的經典算法。它特別適合用于計算從一個起點到其他所有節點的最短路徑&#xff0c;前提是圖中的邊權重為非負數。 一、迪杰斯特拉算法的基本原理 迪杰斯特拉算法的核心思想是“貪心法”…

引領印尼 Web3 變革:Mandala Chain 如何助力 1 億用戶邁向數字未來?

當前 Web3 的發展正處于關鍵轉折點&#xff0c;行業亟需吸引新用戶以推動 Web3 的真正大規模采用。然而&#xff0c;大規模采用面臨著核心挑戰&#xff1a;數據泄露風險、集中存儲的安全漏洞、跨系統互操作性障礙&#xff0c;以及低效的服務訪問等問題。如何才能真正突破這些瓶…

WebSocket是h5定義的,雙向通信,節省資源,更好的及時通信

瀏覽器和服務器之間的通信更便利&#xff0c;比http的輪詢等效率提高很多&#xff0c; WebSocket并不是權限的協議&#xff0c;而是利用http協議來建立連接 websocket必須由瀏覽器發起請求&#xff0c;協議是一個標準的http請求&#xff0c;格式如下 GET ws://example.com:3…

Kaamel白皮書:IoT設備安全隱私評估實踐

1. IoT安全與隱私領域的現狀與挑戰 隨著物聯網技術的快速發展&#xff0c;IoT設備在全球范圍內呈現爆發式增長。然而&#xff0c;IoT設備帶來便捷的同時&#xff0c;也引發了嚴峻的安全與隱私問題。根據NSF&#xff08;美國國家科學基金會&#xff09;的研究表明&#xff0c;I…

php安裝swoole擴展

PHP安裝swoole擴展 Swoole官網 安裝準備 安裝前必須保證系統已經安裝了下列軟件 4.8 版本需要 PHP-7.2 或更高版本5.0 版本需要 PHP-8.0 或更高版本6.0 版本需要 PHP-8.1 或更高版本gcc-4.8 或更高版本makeautoconf 安裝Swool擴展 安裝官方文檔安裝后需要再php.ini中增加…

服務器傳輸數據存儲數據建議 傳輸慢的原因

一、JSON存儲的局限性 1. 性能瓶頸 全量讀寫&#xff1a;JSON文件通常需要整體加載到內存中才能操作&#xff0c;當數據量大時&#xff08;如幾百MB&#xff09;&#xff0c;I/O延遲和內存占用會顯著增加。 無索引機制&#xff1a;查找數據需要遍歷所有條目&#xff08;時間復…

Android四大核心組件

目錄 一、為什么需要四大組件&#xff1f; 二、Activity&#xff1a;看得見的界面 核心功能 生命周期圖解 代碼示例 三、Service&#xff1a;看不見的勞動者 兩大類型 生命周期對比 注意陷阱 四、BroadcastReceiver&#xff1a;消息傳遞專員 兩種注冊方式 廣播類型 …

「Mac暢玩AIGC與多模態01」架構篇01 - 展示層到硬件層的架構總覽

一、概述 AIGC&#xff08;AI Generated Content&#xff09;系統由多個結構層級組成&#xff0c;自上而下涵蓋交互界面、API 通信、模型推理、計算框架、底層驅動與硬件支持。本篇梳理 AIGC 應用的六層體系結構&#xff0c;明確各組件在系統中的職責與上下游關系&#xff0c;…

[MERN 項目實戰] MERN Multi-Vendor 電商平臺開發筆記(v2.0 從 bug 到結構優化的工程記錄)

[MERN 項目實戰] MERN Multi-Vendor 電商平臺開發筆記&#xff08;v2.0 從 bug 到結構優化的工程記錄&#xff09; 其實之前沒想著這么快就能把 2.0 的筆記寫出來的&#xff0c;之前的預期是&#xff0c;下一個階段會一直維持到將 MERN 項目寫完&#xff0c;畢竟后期很多東西都…

互斥量函數組

頭文件 #include <pthread.h> pthread_mutex_init 函數原型&#xff1a; int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr); 函數參數&#xff1a; mutex&#xff1a;指向要初始化的互斥量的指針。 attr&#xf…

互聯網的下一代脈搏:深入理解 QUIC 協議

互聯網的下一代脈搏&#xff1a;深入理解 QUIC 協議 互聯網是現代社會的基石&#xff0c;而數據在其中高效、安全地傳輸是其運轉的關鍵。長期以來&#xff0c;傳輸層的 TCP&#xff08;傳輸控制協議&#xff09;一直是互聯網的主力軍。然而&#xff0c;隨著互聯網應用場景的日…

全球城市范圍30米分辨率土地覆蓋數據(1985-2020)

Global urban area 30 meter resolution land cover data (1985-2020) 時間分辨率年空間分辨率10m - 100m共享方式保護期 277 天 5 時 42 分 9 秒數據大小&#xff1a;8.98 GB數據時間范圍&#xff1a;1985-2020元數據更新時間2024-01-11 數據集摘要 1985~2020全球城市土地覆…

【Vue】單元測試(Jest/Vue Test Utils)

個人主頁&#xff1a;Guiat 歸屬專欄&#xff1a;Vue 文章目錄 1. Vue 單元測試簡介1.1 為什么需要單元測試1.2 測試工具介紹 2. 環境搭建2.1 安裝依賴2.2 配置 Jest 3. 編寫第一個測試3.1 組件示例3.2 編寫測試用例3.3 運行測試 4. Vue Test Utils 核心 API4.1 掛載組件4.2 常…

數據湖的管理系統管什么?主流產品有哪些?

一、數據湖的管理系統管什么&#xff1f; 數據湖的管理系統主要負責管理和優化存儲在數據湖中的大量異構數據&#xff0c;確保這些數據能夠被有效地存儲、處理、訪問和治理。以下是數據湖管理系統的主要職責&#xff1a; 數據攝入管理&#xff1a;管理系統需要支持從多種來源&…