色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

完蛋!我被 Out of Memory 包圍了!

京東云 ? 來源:jf_75140285 ? 作者:jf_75140285 ? 2024-08-15 14:23 ? 次閱讀

先點贊再看,養成好習慣

是極致魅惑、灑脫自由的 Java heap space

是知性柔情、溫婉大氣的 GC overhead limit exceeded

是純真無邪、活潑可愛的 Metaspace

如果以上不是你的菜,那還有……

刁蠻任性,無跡可尋的 CodeCache

性感火辣、心思細膩的 Direct Memory

高貴冷艷,獨愛你一人的 OOM Killer

總有一款,能讓你鐘情!BUG 選擇權,現在交由你手!

Java heap space

這是最常見的一個 OOM 問題了,誰還沒經歷過一個 Heap OOM呢?

當堆內存被塞滿之后,一邊 GC 無法及時回收,一邊又在繼續創建新對象,Allocator 無法分配新的內存之后,就會送一個 OOM 的錯誤:

java.lang.OutOfMemoryError: Java heap space

分析解決起來無非是那幾步:

dump 堆內存

通過 MAT、YourKit、JProfiler 、IDEA Profiler 等一系列工具分析dump文件

找到占用內存最多、最大的對象,看看是哪個小可愛干的

分析代碼,嘗試優化代碼、減少對象創建

增加 JVM 堆內存、限制請求數、線程數、增加節點數量等

常見類庫使用誤區

尤其是一些工具庫,盡可能的避免每次新建對象,從而節省內存提升性能。

大多數主流的類庫,入口類都保證了單例線程安全,全局維護一份即可

舉一些常見的錯誤使用例子:

Apache HttpClient

CloseableHttpClient ,這玩意相當于一個“瀏覽器進程”了,背后有連接池連接復用,一堆機制的輔助類,如果每次都 new 一個,不僅速度慢,而且浪費了大量資源。

比較正常的做法是,全局維護一個(或者根據業務場景分組,每組一個)實例,服務啟動時創建,服務關閉時銷毀:

CloseableHttpClient httpClient = HttpClients.custom()
                .setMaxConnPerRoute(maxConnPerRoute)
                .setMaxConnTotal(maxConnTotal)
                /// ...
                                 .build();

Gson

畢竟是 Google 的項目,入口類自然也是實現了線程安全,全局維護一份 Gson 實例即可

Jackson

Jackson 作為 Spring MVC 默認的 JSON 處理庫,功能強大、用戶眾多,xml/json/yaml/properties/csv 各種主流格式都支持,單例線程安全自然也是 ok 的,全局維護一份 ObjectMapper 即可。

GC overhead limit exceeded

這個錯誤比較有意思,上面的 Java heap space 是內存徹底滿了之后,還在持續的創建新對象,此時服務會徹底假死,無法處理新的請求。

而這個錯誤,只是表示 GC 開銷過大,Collector 花了大量的時間回收內存,但釋放的堆內存卻很小,并不代表服務死了

此時程序處于一種很微妙的狀態:堆內存滿了(或者達到回收閾值),不停的觸發 GC 回收,但大多數對象都是可達的無法回收,同時 Mutator 還在低頻率的創建新對象。

出現這個錯誤,一般都是流量較低的場景,有太多常駐的可達對象無法回收,但是吧,GC 后空閑的內存還可以滿足服務的基本使用

不過此時,已經在頻繁的老年代GC了,老年代又大對象又多、在現有的回收算法下,GC 效率非常低并切資源占用巨大,甚至會出現把 CPU 打滿的情況。

出現這個錯誤的時候,從監控角度看起來可能是這個樣子:

請求量可能并不大

不停 GC,并切暫停時間很長

時不時的還有新的請求,但響應時間很高

CPU 利用率很高

畢竟還是堆內存的問題,排查思路和上面的 Java heap space 沒什么區別。

Metaspace/PermGen

Metaspace 區域里,最主要的就是 Class 的元數據了,ClassLoader 加在的數據,都會存儲在這里。

MetaSpace 初始值很小,默認是沒有上限的。當利用率超過40%(默認值 MinMetaspaceFreeRatio)會進行擴容,每次擴容一點點,擴容也不會直接 FullGC。

比較推薦的做法,是不給初始值,但限制最大值:

-XX:MaxMetaspaceSize=

不過還是得小心,這玩意滿了后果很嚴重,輕則 Full GC,重則 OOM:

java.lang.OutOfMemoryError: Metaspace

排查 MetaSpace 的問題,主要思路還是追蹤 Class Load數據,比較主流的做法是:

通過 Arthas 之類的工具,查看 ClassLoader、loadClassess 的數據,分析數量較多的 ClassLoader 或者 Class

打印每個 class 的加載日志:-XX:+TraceClassLoading -XX:+TraceClassUnloading

下面介紹幾個常見的,可能導致 MetaSpace 增長的場景:

反射使用不當

JAVA 里的反射,性能是非常低的,以反射的對象必須得緩存起來。尤其是這個Method對象,如果在并發的場景下,每次都獲取新的 Method,然后 invoke 的話,用不了多久 MetaSpace 就給你打爆!

簡單的說,并發場景下,Method.invoke 會重復的動態創建 class,從而導致 MetaSpace 區域增長,具體分析可以參考笨神的文章《從一起GC血案談到反射原理》。

用反射時,盡可能的用成熟的工具類,Spring的、Apache的都可以。它們都內置了reflection相關對象的緩存,功能又全性能又好,足以解決日常的使用需求。

一些 Agent 的 bug

一些 Java Agent,靜態的和運行時注入的都算。基于 Instrumentation 這套 API 做了各種增強,一會 load 一會 redefine 一會remove的,如果不小心出現 BUG,也很容易生成大量動態的 class,從而導致 metaspace 打滿。

動態代理問題

像 Spring 的 AOP ,也是基于動態代理實現的,不管是 CgLib 還是 JDK Proxy,不管是 ASM 還是 ByteBuddy。最終的結果都逃不開動態創建、加載 Class,有這兩個操作,那 Metaspace 必定受影響。

Spring 的 Bean 默認是 singleton 的,如果配置為 prototype,那么每次 getBean 就會創建新的代理對象,重新生成動態的 class、重新 define,MetaSpace 自然越來越大。

Code Cache

Code Cache 區域,存儲的是 JIT 編譯后的熱點代碼緩存(注意,編譯過程中使用的內存不屬于 Code cache),也屬于 non heap 。

如果 Code cache 滿了,你可能會看到這么一條日志:

Server VM warning: CodeCache is full. Compiler has been disabled.

此時 JVM 會禁用 JIT 編譯,你的服務也會開始變慢。

Code Cache 的上限默認比較低,一般是240MB/128MB,不同平臺可能有所區別。

可以通過參數來調整 Code Cache 的上限:

-XX:ReservedCodeCacheSize=

只要盡量避免過大的Class、Method ,一般也不太會出現這個區域被打滿的問題,默認的 240MB/128MB 也足夠了

Direct Memory

Direct Memory 區域,一般稱之為直接內存,很多涉及到 磁盤I/O ,Socket I/O 的場景,為了“Zero Copy”提升性能都會使用 Direct Memory。

就比如 Netty ,它真的是把 Direct Memory 玩出了花(有空寫一篇 Netty 內存管理分析)……

使用 Direct Memory時,相當于直接繞過 JVM 內存管理,調用 malloc() 函數,體驗手動管理內存的樂趣~

不過吧,這玩意使用比較危險,一般都配合 Unsafe 操作,一個不小心地址讀寫的地址錯誤,就能得到一個 JVM 給你的驚喜:

#
# A fatal error has been detected by the Java Runtime Environment:
#
#  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00007ffdbd5d19b4, pid=1208, tid=0x0000000000002ee0
#
# JRE version: Java(TM) SE Runtime Environment (8.0_301-b09) (build 1.8.0_301-b09)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.301-b09 mixed mode windows-amd64 compressed oops)  
# Problematic frame:
# C  [msvcr100.dll+0x119b4]
# 
# No core dump will be written. Minidumps are not enabled by default on client versions of Windows
#
# If you would like to submit a bug report, please visit:
#   http://bugreport.java.com/bugreport/crash.jsp
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
#

更多的解釋,可以參考我這篇《Java中的Heap Buffer與Direct Buffer

這個 Direct Memory 區域,默認是無上限的,但為了防止被 OS Kill,還是會限制一下,給個256MB或者更小的值,防止內存無限增長:

-XX:MaxDirectMemorySize=

如果 Direct Memory 達到 MaxDirectMemorySize 并且無法釋放時,就會得到一個 OOM錯誤:

java.lang.OutOfMemoryError: Direct buffer memory

Linux OOM Killer

跳出 JVM 內存管理之后,當 OS 內存耗盡時,Linux 會選擇內存占用最多,優先級最低或者最不重要的進程殺死。

一般在容器里,主要的進程就是肯定是我們的 JVM ,一旦內存滿,第一個殺的就是它,而且還是 kill -TERM (-9)信號,打你一個猝不及防。

如果 JVM 內存參數配置合理,遠低于容器內存限制,還是出現了 OOM Killer 的話,那么恭喜你,大概率是有什么 Native 內存泄漏。

這部分內存,JVM 它還管不了。

除了 JVM 內部的 Native 泄漏 BUG 這種小概率事件外,大概率是你引用的第三方庫導致的。

這類問題排查起來非常麻煩,畢竟在 JVM 之外,只能靠一些原生的工具去分析。

而且吧,這種動不動就要 root 權限的工具,可是得領導審批申請權限的……排查成本真的很高

排查 Native 內存的基本的思路是:

pmap 查看內存地址映射,定位可疑內存塊、分析內存塊數據

strace 手動追蹤進程系統調用,分析內存分配的系統調用鏈路

更換jemalloc/tcmalloc之類的內存分配器(或者 async-profiler有個支持native 分析的分支)追蹤malloc的調用鏈路

目前最常見的 Native 內存泄漏場景,是 JDK 的 Inflater/Deflater 這倆臥龍鳳雛,功能是提供 GZIP 的壓縮、解壓,在默認 glibc 的 malloc 實現下,很容易出現“內存泄漏”。如果出現 Native 內存泄漏,可以先看看應用里有沒有 GZIP 相關操作,說不定有驚喜。


好了,各類風格的 OOM 都感受完了,到底哪一個更能打動你呢?

審核編輯 黃宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • JAVA
    +關注

    關注

    19

    文章

    2971

    瀏覽量

    104850
  • JVM
    JVM
    +關注

    關注

    0

    文章

    158

    瀏覽量

    12238
收藏 人收藏

    評論

    相關推薦

    別動,人類已經超級樂視包圍了

    漂著樂視云……人類已經超級樂視包圍了。##樂視打智能手機這張牌令 “平臺+內容+終端+應用”的生態模式看起來更加完備。
    發表于 04-15 09:26 ?1420次閱讀

    基于 GPU 渲染的高性能空間包圍計算

    空間包圍檢測在計算機圖形學、虛擬仿真、工業生產等有著廣泛的應用。
    的頭像 發表于 02-18 10:47 ?695次閱讀
    基于 GPU 渲染的高性能空間<b class='flag-5'>包圍</b>計算

    Matlab Out of memory問題總結(1)

    首先,要聲明,matlab自帶的Help才是最權威的Matlab學習資料,如果有時間好好學習一下或是可以高效的使用的話,一定受益匪淺!比如說像Out of Memory這個問題,最開始
    發表于 02-24 15:26

    Matlab Out of memory問題總結(2)

    arrayY1000x10004004000double array (sparse)5.使用pack命令當內存分為很多碎片以后,其實本身可能有很大的空間,只是沒有作構的連續空間即大的Block而已。如果此時Out
    發表于 02-24 15:27

    vivado建立AD9361配置工程總是彈出out of memory錯誤

    運行system_project.tcl之后一段時間總是彈出out of memory 錯誤。但是改用vivado2013.4版本使用相應的hdl_2014_r1則不存在問題,請問vivado2014.2遇到的out of
    發表于 10-08 16:37

    matlab打開1G以上的數據出現out of memory error

    用matlab打開1G以上的數據出現out of memory error誰遇到過這個情況么 有什么有效的解決辦法么
    發表于 04-17 06:36

    C6748_NandWrite.out文件報錯

    verify target memory and memory map。看了下,0xC0000000是DDR2的地址。想問下C6748_NandWrite.
    發表于 05-29 15:38

    PSoC Creator怎么進行嵌入式設計?

    嵌入式系統是計算設備硬件中嵌入軟件作為其核心組件的應用。我們身邊現在已經嵌入式系統包圍了,這些產品能為我們的生活帶來各種方便乃至奢華的功能,包括移動手持設備、洗衣機、微波爐、ATM 機、空調等等。由于某些特定的應用要求,工程師必須以不同于其它設計類型的特定方法進行嵌入式
    發表于 04-13 07:04

    運行時出現out of memory是堆配置原因嗎

    [C674X_0] ti.sy***ios.heaps.HeapMem: line 307: out of memory: handle=0xc01d7118, size
    發表于 04-22 14:15

    大佬們,Error (114016): Out of memory in module quartus_map.exe (20434 megabytes used)怎么解決

    Error (114016): Out of memory in module quartus_map.exe (20434 megabytes used)Error (293007
    發表于 06-01 07:31

    pads 9.5 / VX2.11 Out of memory

    在win10/win11下使用PADS layout時,報錯‘’Out of memory‘’,或者報錯‘’數據庫嚴重錯誤編號 2010‘’已經嘗試過:1.加大內存條內存,無法解決2.加大虛擬內存
    發表于 03-25 18:58

    用VScode將kmodel和代碼制作成的bin文件燒入K210開發板中出現“iomem malloc out of memory”是什么情況?

    用VScode將kmodel和代碼制作成的bin文件燒入K210開發板中出現“iomem malloc out of memory”是什么情況?
    發表于 09-13 06:35

    PCB設計:盤中孔工藝,到底有多大價值?

    不知道大家在畫PCB的時候會不會遇到這樣的情況:芯片的引腳太密,某個引腳想要走線出去但是完全包圍了,尤其是在BGA封裝的芯片中。例如下圖中的U1_B7引腳就沒有辦法再走線出去,四周都被包圍了
    發表于 10-24 11:25 ?2370次閱讀

    盤中孔工藝有多大價值?先前為什么在市場上沒有普及呢?

    不知道大家在畫PCB的時候會不會遇到這樣的情況:芯片的引腳太密,某個引腳想要走線出去但是完全包圍了,尤其是在BGA封裝的芯片中。例如下圖中的U1_B7引腳就沒有辦法在走線出去,四周都被包圍了
    的頭像 發表于 11-15 09:47 ?1724次閱讀

    宏景智駕亮相WNAT-CES展:完蛋智駕友商包圍了

    11月10日-12日,2023年世界新汽車技術合作生態展(WNAT-CES)在江蘇蘇州昆山國際會展中心隆重舉辦,宏景智駕攜旗下系列產品亮相本次展會。 此次宏景智駕展出的產品包括支持ADAS功能的智能攝像頭產品以及支持L2+級智能駕駛功能實現的系列域控制器產品,目前這些產品皆已在國內主流車企的暢銷車型上實現量產交付。 作為全棧智能駕駛研發公司,在軟件層面,宏景智駕在行車、泊車以及行泊一體系統開發領域也有深厚的積累。此次展會也是集中展示了宏
    的頭像 發表于 11-14 15:10 ?581次閱讀
    宏景智駕亮相WNAT-CES展:<b class='flag-5'>完蛋</b>!<b class='flag-5'>我</b><b class='flag-5'>被</b>智駕友商<b class='flag-5'>包圍了</b>!
    主站蜘蛛池模板: 长泽梓黑人初解禁bdd07| 成人网站国产在线视频内射视频| 少妇一夜未归暴露妓女身份| 无码人妻少妇色欲AV一区二区 | 娇妻归来在线观看免费完整版电影| 日本免费无码A专区在线观看| 香艳69xxxxx有声小说| 边做边爱播放3免费观看| 果冻传媒独家原创在线观看| 忘忧草研究院一二三| 高H高肉强J短篇校园| 涩涩999| 最近2019中文字幕免费版视频| 风情韵味人妻HD| 色偷偷影院| 国产精品久久久久久精品... | 久久偷拍国2017的| 在线国产a不卡| 恋夜直播午夜秀场最新| 中字幕视频在线永久在线| 免费成人高清在线视频| 9LPORM原创自拍达人| 久久九九免费| 在线高清电影理论片4399| 美女丝袜夹b| 北条麻妃のレズナンパ| 久久无码av三级| 2023国产精品一卡2卡三卡4卡| 国产精品免费一区二区三区四区 | 啪啪后入内射日韩| 一级毛片免费在线播放| 两个女人互添下身高潮自视频| 97综合久久| 久久亚洲精品AV成人无码| 2023国产精品一卡2卡三卡4卡| 欧美人与禽zoz0性伦交app| 囯产精品久久久久久久久免费蜜桃 | 极品虎白在线观看| 97精品国产亚洲AV超碰| 少妇邻居内射在线| 久久99re66热这里只有精品|