JVM筆記 —— 出現內存溢出錯誤時時如何排查

一、出現內存溢出的幾種情況

內存溢出錯誤分為StackOverflowError和OutOfMemoryError,前者是棧中出現溢出,后者一般是堆或方法區出現溢出,簡稱OOM

1. 棧溢出 StackOverflowError

棧溢出一般都是因為沒有正確的結束遞歸導致的,無限遞歸導致超出棧內存(-Xss)限制時就會拋出StackOverflowError。這種情況直接根據異常信息定位到代碼位置進行修正即可。
在這里插入圖片描述
在這里插入圖片描述

2. 方法區溢出 OOM

當方法區中加載的類過多,比如通過動態代理生成很多代理類或者熱部署時熱加載了過多的類,多到超出方法區內存限制時(-XX:MaxMetaspaceSize),會拋出OutOfMemoryError。但這種情況一般也比較少見,如果真出現這種情況可以考慮增加MetaspaceSize,或者拆分服務,使得一個服務使用的類不超出限制。

3. 堆溢出 OOM

其實大部分OOM都是發生在堆區,當堆中存儲的對象過多,GC來不及回收或者回收不掉,沒有足夠空間創建新對象,就會拋出OutOfMemoryError。

java.lang.OutOfMemoryError: Java heap space

二、OOM排查思路

當堆區出現OOM時,就需要我們去進行排查,看什么對象把內存吃滿了

  1. 第一步:我們需要拿到發生OOM時堆區的內存快照heap dump,這里面保存了某一時刻堆中對象的情況。heap dump有兩種方式可以拿到。第一種就是我們預先在jvm進程啟動時開啟參數配置-XX:+HeapDumpOnOutOfMemoryError,-XX:HeapDumpPath=/usr/local/oom,當發生OOM時會自動生成heap dump保存在指定路徑下,這也是推薦的方式。第二種方式是如果jvm進程沒有被結束,可以用工具比如jdk自帶的jvisualvm手動獲取指定進程id的heap dump。
  2. 第二步:將拿到的heap dump導入到分析工具中,比如說MemoryAnalyzer,通過工具分析可以看到是哪些類型對象占用了大量內存及其GC引用鏈,還有錯誤棧等信息。
  3. 第三步:根據分析得到的信息到代碼中進行排查,如果是代碼邏輯有問題就改代碼,比如不恰當的強引用導致的內存泄漏。如果代碼邏輯沒問題,確實需要占這么多內存,那就考慮提升堆內存大小(-Xms -Xmx)。

參考:
https://blog.csdn.net/qq_31363843/article/details/117038001
https://blog.csdn.net/weixin_41010294/article/details/104009722

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

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

相關文章

Linux中安裝MySQL8版本,安裝MySQL步驟,MySQL8離線安裝

Linux中安裝MySQL8版本的步驟如下: 1.檢查下libaio.so.1的位置 [roottdx ]# whereis libaio.so.1 libaio.so: /usr/lib64/libaio.so.1 如果沒有找到該文件 (1).在線安裝 [roottdx ]# yum install -y libaio (2).離線安裝: 上傳之后執行命令安裝&#…

pymysql 庫 - python 操作 mysql

環境: Win10 x64 Python 3.7 PyMySQL 1.0.2 MySQL 8.0.27 1 安裝 pip install pymysql 2 地址 https://pypi.org/project/pymysql/ 3.1 數據庫版本查詢 (search_version.py) import pymysql# 打開數據庫連接 try:db pymysql.connect(hostlocalhost, userr…

python安裝第三方包時報錯:...\lib\site-packages\pip\_vendor\urllib3\response.py...

安裝redis第三方包: pip install redis報錯現象: 解決方法:使用以下命令可成功安裝 pip install redis -i http://pypi.douban.com/simple --trusted-host pypi.douban.com

關于網絡入侵檢測領域使用Spark/Flink等計算框架做分布式

關于網絡入侵檢測領域使用Spark/Flink等計算框架做分布式 0、引言1 基于LightGBM的網絡入侵檢測研究2 基于互信息法的智能化運維系統入侵檢測Spark實現3 基于Spark的車聯網分布式組合深度學習入侵檢測方法4 基于Flink的分布式在線集成學習框架研究5 基于Flink的分布式并行邏輯回…

mongodb基礎

mongodb語法 參考文檔:https://docs.mongodb.com/manual/reference/ BSON Types BSON Type有2種標識符,整形和字符串 類型數值字符串說明Double1“double”String2“string”Object3“object”Array4“array”Binary data5“binData”Undefined6“un…

8.9黃金最新行情走勢分析及短線交易策略

近期有哪些消息面影響黃金走勢?黃金多空該如何研判? ?黃金消息面解析:周三(8月9日)現貨黃金維持震蕩,目前交投于1930美元附近,隔日現貨黃金盤中震蕩下行,失守1930關口并在美盤時段…

【Spring】-Spring的IoC和DI

作者:學Java的冬瓜 博客主頁:?冬瓜的主頁🌙 專欄:【Framework】 主要內容:什么是spring?IoC容器是什么?如何使代碼解耦合?IoC的核心原理,IoC的優點。依賴注入/對象裝配/…

【ARM 嵌入式 編譯系列 10 -- GCC 編譯縮減可執行文件 elf 文件大小】

文章目錄 GCC 如何縮減可執行文件size測試代碼 上篇文章:ARM 嵌入式 編譯系列 9-- GCC 編譯符號表(Symbol Table)的詳細介紹 下篇文章:ARM 嵌入式 編譯系列 10.1 – GCC 編譯縮減可執行文件 elf 文件大小 GCC 如何縮減可執行文件s…

Linux下在qtcreator中創建qt程序

目錄 1、新建項目 2、單工程項目創建 3、多工程項目創建 4、添加子工程(基于多工程目錄結構) 5、 .pro文件 1、新建項目 切換到“編輯”界面,點擊菜單欄中的“文件”-“新建文件或項目” 2、單工程項目創建 只有一個工程的項目&#…

Axure RP移動端高保真CRM辦公客戶管理系統原型模板及元件庫

Axure RP移動端高保真CRM辦公客戶管理系統原型模板及元件庫,一套典型的移動端辦公工具型APP Axure RP原型模板,可根據實際的產品需求進行擴展,也可以作為移動端原型設計的參考案例。為提升本作品參考價值,在模板設計過程中盡量追求…

chatGPT應用于房地產行業

作為 2023 年的房地產專業人士,您無疑認識到技術對行業的重大影響。近年來,一項技術進步席卷了世界——人工智能。人工智能徹底改變了房地產業務的各個方面,從簡化管理任務到增強客戶互動。 在本文中,我們將探討幾種巧妙的人工智…

HTML 語言簡介

1.概述 HTML 是網頁使用的語言,定義了網頁的結構和內容。瀏覽器訪問網站,其實就是從服務器下載 HTML 代碼,然后渲染出網頁。 HTML 的全名是“超文本標記語言”(HyperText Markup Language),上個世紀90年代…

zabbix自動注冊服務器以及部署代理服務器

文章目錄 Zabbix自動注冊服務器及部署代理服務器一.zabbix自動注冊1.什么是自動注冊2.環境準備3.zabbix客戶端配置4.在 Web 頁面配置自動注冊5.驗證自動注冊 二.部署 zabbix 代理服務器1.分布式監控的作用:2.環境部署3.代理服務器配置4.客戶端配置5.web頁面配置5.1 …

MS9940T 國產 模擬前端AFE芯片 11-15 節鋰電池或磷酸鹽電池管理芯片 替代BQ76940

產品簡述 MS9940T 是模擬前端 (AFE) 芯片,支持11 到 15 組電池串聯。通過 I 2 C ,主機控制器 可以使用 MS9940T 來實現電池組管理功能,例如監控(電池電壓、電池組電流、電池組 溫度)、保護(控制…

分類預測 | MATLAB實現GWO-BiLSTM-Attention多輸入分類預測

分類預測 | MATLAB實現GWO-BiLSTM-Attention多輸入分類預測 目錄 分類預測 | MATLAB實現GWO-BiLSTM-Attention多輸入分類預測預測效果基本介紹程序設計參考資料 預測效果 基本介紹 1.GWO-BiLSTM-Attention 數據分類預測程序 2.代碼說明:基于灰狼優化算法&#xff08…

vuejs 設計與實現 - 組件的實現原理

1.渲染組件 如果是組件則:vnode .type的值是一個對象。如下: const vnode {type: MyComponent,}為了讓渲染器能處理組件類型的虛擬節點,我們還需要在patch函數中對組件類型的虛擬節點進行處理,如下: function patc…

CentOS7.9 禁用22端口,使用其他端口替代

文章目錄 業務場景操作步驟修改sshd配置文件修改SELinux開放給ssh使用的端口修改防火墻,開放新端口重啟sshd生效 相關知識點介紹sshd服務SELinux服務firewall.service服務 業務場景 我們在某市實施交通信控平臺項目,我們申請了一臺服務器,用…

學習Vue:列表渲染(v-for)

在 Vue.js 中,實現動態列表的顯示是非常常見的需求。為了達到這個目的,Vue 提供了 v-for 指令,它允許您迭代一個數組或對象,將其元素渲染為列表。然而,在使用 v-for 時,key 屬性的設置也非常重要&#xff0…

微信小程序(原生)搜索功能實現

一、效果圖 二、代碼 wxml <van-searchvalue"{{ keyword }}"shape"round"background"#000"placeholder"請輸入關鍵詞"use-action-slotbind:change"onChange"bind:search"onSearch"bind:clear"onClear&q…

實踐-CNN卷積層

實踐-CNN卷積層 1 卷積層構造2 整體流程3 BatchNormalization效果4 參數對比5 測試效果 1 卷積層構造 2 整體流程 根據網絡結構來寫就可以了。 池化 拉平 訓練一個網絡需要2-3天的時間。用經典網絡來&#xff0c;一些細節沒有必要去扣。 損失函數&#xff1a; fit模型&…