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/web/76968.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/76968.shtml
英文地址,請注明出處:http://en.pswp.cn/web/76968.shtml

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

相關文章

如何在Spring Boot中配置自定義端口運行應用程序

Spring Boot 應用程序默認在端口 8080 上運行嵌入式 Web 服務器&#xff08;如 Tomcat、Jetty 或 Undertow&#xff09;。然而&#xff0c;在開發、測試或生產環境中&#xff0c;開發者可能需要將應用程序配置為在自定義端口上運行&#xff0c;例如避免端口沖突、適配微服務架構…

linux嵌入式(進程與線程1)

Linux進程 進程介紹 1. 進程的基本概念 定義&#xff1a;進程是程序的一次執行過程&#xff0c;擁有獨立的地址空間、資源&#xff08;如內存、文件描述符&#xff09;和唯一的進程 ID&#xff08;PID&#xff09;。 組成&#xff1a; 代碼段&#xff1a;程序的指令。 數據…

智馭未來:NVIDIA自動駕駛安全白皮書與實驗室創新實踐深度解析

一、引言&#xff1a;自動駕駛安全的范式革新 在當今數字化浪潮的推動下&#xff0c;全球自動駕駛技術正大步邁入商業化的深水區。隨著越來越多的自動駕駛車輛走上道路&#xff0c;其安全性已成為整個行業乃至社會關注的核心命題。在這個關鍵的轉折點上&#xff0c;NVIDIA 憑借…

多模態大模型 Qwen2.5-VL 的學習之旅

Qwen-VL 是阿里云研發的大規模視覺語言模型&#xff08;Large Vision Language Model, LVLM&#xff09;。Qwen-VL 可以以圖像、文本、檢測框作為輸入&#xff0c;并以文本和檢測框作為輸出。Qwen-VL 系列模型性能強大&#xff0c;具備多語言對話、多圖交錯對話等能力&#xff…

Redis 與 Memcache 全面對比:功能、性能與應用場景解析

Redis 和 Memcache 都是常用的內存數據庫&#xff0c;以下是它們在多個方面的能力比較&#xff1a; 一、數據類型 Redis&#xff1a;支持豐富的數據類型&#xff0c;如字符串&#xff08;String&#xff09;、哈希&#xff08;Hash&#xff09;、列表&#xff08;List&#x…

Oracle--PL/SQL編程

前言&#xff1a;本博客僅作記錄學習使用&#xff0c;部分圖片出自網絡&#xff0c;如有侵犯您的權益&#xff0c;請聯系刪除 PL/SQL&#xff08;Procedural Language/SQL&#xff09;是Oracle數據庫中的一種過程化編程語言&#xff0c;構建于SQL之上&#xff0c;允許編寫包含S…

新增優惠券

文章目錄 概要整體架構流程技術細節小結 概要 接口分析 一個基本的新增接口&#xff0c;按照Restful風格設計即可&#xff0c;關鍵是請求參數。之前表分析時已經詳細介紹過這個頁面及其中的字段&#xff0c;這里不再贅述。 需要特別注意的是&#xff0c;如果優惠券限定了使…

力扣面試經典150題(第二十三題)- KMP算法

問題 給你兩個字符串 haystack 和 needle &#xff0c;請你在 haystack 字符串中找出 needle 字符串的第一個匹配項的下標&#xff08;下標從 0 開始&#xff09;。如果 needle 不是 haystack 的一部分&#xff0c;則返回 -1 。 示例 1&#xff1a; 輸入&#xff1a;haysta…

PostgreSQL 的 MVCC 機制了解

PostgreSQL 的 MVCC 機制了解 PostgreSQL 使用多版本并發控制(MVCC)作為其核心并發控制機制&#xff0c;這是它與許多其他數據庫系統的關鍵區別之一。MVCC 允許讀操作不阻塞寫操作&#xff0c;寫操作也不阻塞讀操作&#xff0c;從而提供高度并發性。 一 MVCC 基本原理 1.1 M…

互聯網大廠Java面試:RocketMQ、RabbitMQ與Kafka的深度解析

互聯網大廠Java面試&#xff1a;RocketMQ、RabbitMQ與Kafka的深度解析 面試場景 面試官&#xff1a;馬架構&#xff0c;您好&#xff01;歡迎參加我們的面試。今天我們將圍繞消息中間件展開討論&#xff0c;尤其是RocketMQ、RabbitMQ和Kafka。您有十年的Java研發和架構設計經…

《巧用DeepSeek快速搞定數據分析》書籍分享

文章目錄 前言內容簡介作者簡介購書鏈接書籍目錄 前言 隨著大數據時代的到來&#xff0c;數據分析和人工智能技術正迅速改變著各行各業的運作方式。DeepSeek作為先進的人工智能模型&#xff0c;不僅在自然語言處理領域具有廣泛應用&#xff0c;還在數據分析、圖像識別、推薦系…

4.Three.js 中 Camera 攝像機詳解

一、什么是 Camera&#xff1f; 在 Three.js 中&#xff0c;Camera&#xff08;攝像機&#xff09;決定了我們如何觀察三維場景。 你可以把它理解為我們“眼睛”的位置和方向&#xff0c;場景中的物體再復雜&#xff0c;如果沒有攝像機&#xff0c;就沒有“觀察角度”&#x…

gem5-gpu教程03 當前的gem5-gpu軟件架構(因為涉及太多專業名詞所以用英語表達)

Current gem5-gpu Software Architecture 這是當前gem5-gpu軟件架構的示意圖。 Ruby是在gem5-gpu上下文中用于處理CPU和GPU之間內存訪問的高度可配置的內存系統 CudaCore (src/gpu/gpgpu-sim/cuda_core.*, src/gpu/gpgpu-sim/CudaCore.py) Wrapper for GPGPU-Sim shader_cor…

負載均衡的實現方式有哪些?

負載均衡實現方式常見的有: 軟件負載均衡、硬件負載均衡、DNS負載均衡 擴展 二層負載均衡&#xff1a;在數據鏈路層&#xff0c;基于MAC地址進行流量分發&#xff0c;較少見于實際應用中 三層負載均衡&#xff1a;在網絡層&#xff0c;基于IP地址來分配流量&#xff0c;例如某…

MyBatis 和 MyBatis-Plus 在 Spring Boot 中的配置、功能對比及 SQL 日志輸出的詳細說明,重點對比日志輸出的配置差異

以下是 MyBatis 和 MyBatis-Plus 在 Spring Boot 中的配置、功能對比及 SQL 日志輸出的詳細說明&#xff0c;重點對比日志輸出的配置差異&#xff1a; 1. MyBatis 和 MyBatis-Plus 核心對比 特性MyBatisMyBatis-Plus定位基礎持久層框架MyBatis 的增強版&#xff0c;提供代碼生…

《數據結構世界的樂高積木:順序表的奇幻旅程》

目錄 1. 線性表 2. 順序表 2.1 概念與結構 2.2 分類 2.2.1 靜態順序表 2.2.2 動態順序表 2.3 動態順序表的實現 1. 線性表 線性表&#xff08;linear list&#xff09;是n個具有相同特性的數據元素的有限序列。線性表是?種在實際中?泛使?的數據結構&#xff0c;常?的…

RHCE 練習二:通過 ssh 實現兩臺主機免密登錄以及 nginx 服務通過多 IP 區分多網站

一、題目要求 1.配置ssh實現A&#xff0c;B主機互相免密登錄 2.配置nginx服務&#xff0c;通過多ip區分多網站 二、實驗 實驗開始前需準備兩臺 linux 主機便于充當服務端以及客戶端&#xff0c;兩臺主機 IP 如下圖&#xff1a; 實驗1&#xff1a;配置 ssh 實現 A&#xff0…

第十五屆藍橋杯 2024 C/C++組 好數

題目&#xff1a; 題目描述&#xff1a; 題目鏈接&#xff1a; 好數 思路&#xff1a; 第一種思路詳解&#xff1a; 因為每次檢查數都是從個位開始&#xff0c;所以對于每一個數都是先檢查奇數位再檢查偶數位&#xff0c;即存在先檢查奇數位再檢查偶數位的循環。注意一次完…

展銳Android13狀態欄默認顯示電池電量百分比

展銳Android13電池狀態默認不顯示電池電量百分比&#xff0c;打開 /frameworks/base/packages/SettingsProvider/res/values/defaults.xml 在xml的文件最后&#xff0c;增加一項配置def_show_battery_percent&#xff1a; <?xml version"1.0" encoding"u…

OpenCV 高斯模糊 cv2.GaussianBlur

OpenCV 高斯模糊 cv2.GaussianBlur flyfish cv2.GaussianBlur 是 OpenCV 庫中用于對圖像進行高斯模糊處理的函數。 高斯模糊的含義 高斯模糊是一種常見的圖像濾波技術&#xff0c;它可以對圖像進行平滑處理&#xff0c;減少圖像中的噪聲和細節&#xff0c;使得圖像看起來更…