java内存泄露的原因_十万个为什么_诗歌大全

诗歌大全>知识>十万个为什么

java内存泄露的原因

发布时间:2020-06-21 18:58:08

分类:十万个为什么发布者:痴守过去

内存洩漏大家都不陌生了,那麽java内存洩露的原因是什麽呢?下面是生活日記小編精心爲你整理的java内存洩露的原因,一起來看看。

java内存洩露的原因

java内存洩露典型特征

現象一:堆/Perm 區不斷增長, 沒有下降趨勢(回收速度趕不上增長速度), 最後不斷觸發FullGC, 甚至crash(如下兩張圖是同一個應用的GC和Perm數據, GC觸發原因确認是Perm不足). 一般是現象二的晚期表現。

現象二:每次FullGC後, 堆/Perm 區在慢慢的增長, 最後不斷觸發FullGC, 甚至crash。

java内存洩露場景---PermGen space

原因:說明Perm不足. Perm存放class,method相關對象,以及運行時常量對象. 如果一個應用加載了大量的class, 那麽Perm區存儲的信息一般會比較大.另外大量的intern String對象也會導緻Perm區不斷增長。 此區域大小由-XX:MaxPermSize參數進行設置.

案例: Groovy動态編譯class, xstream String.intern

本質原因:ClassLoader.defineClass和java.lang.String.intern在大量不适宜的場景被調用.

解決方案:

方案1(直接有效): 使用btrace相關工具輸出調用ClassLoader.defineClass棧信息, 從棧信息來追溯問題.

用JProfiler來trace String.intern方法棧

方案2: dump heap, 看看哪些class有異常現象(數量), String被Perm區引用的對象信息等.但這種方式不太直觀,可以從String數據看看發現可疑問題,沒有方案1直觀。(如下圖: 如果能在日常調試推薦JProfiler)

方案3: 增加-XX: TraceClassLoading和-XX: TraceClassUnloading, 看看哪些class加載了,哪些class卸載了. 如果一些特殊的class一直被加載而沒有被卸載說明也是有問題的。

方案4:執行jmap -permgen(jstat -gcutil 可以查看内存增長速度和區域)命令看看Perm區中的内容, 初步确定是否存在問題 。

java内存洩露場景---Java heap space

原因:長生命周期的對象引用了短生命周期(應該盡快GC回收掉)的對象,最後

[!--empirenews.page--]

後造成一個對象已經不能在堆區分配足夠空間. 注: 這種現象不能完全肯定是内存洩露, 比如: heap本身的設置的過小.

案例: 我個人沒有遇到過這種案例, 但模拟過這種情形的Demo: 參考我的《深入淺出JProfiler》文章, 也學習過其他同學的案例: 例如:參數過大并且頻繁超時導緻内存洩露

解決方案:

觸發FullGC, dump live heap. 标記堆中對象數量, 重點關注可疑對象

觸發FullGC, dump live heap. 标記堆中對象數量, 重點關注可疑對象

對比步驟1和步驟2 相同對象的數量和大小, 找出可疑對象一一進行排查确認。

如果步驟3依然無法明确有問題的對象, 那就多執行幾次步驟1和步驟2。在此過程中可以調整GC觸發時間, 模拟真實的故障場景

看看GC後堆的大小是否增長, 如果沒有不斷增長, 并且持續一段較長時間, 那基本正常(具體看看。

java内存洩露怎麽辦

縮小問題的範圍

要找出内存洩漏的原因當下已經有許多工具可用,比如JVisualVM或者jStat。這些工具是JDK自帶的,所以大家随時都能用。除了要識别一些常用的内部Java類,一些用戶自定義累同樣需要識别。

性能優化

在日常的開發過程中,隻要GC沒有影響到性能,開發者就不會去關注内存設置于配置。從而埋下了潛在的隐患:因爲内存問題并不隻有溢出和洩露,GC時間過長同樣會造成這個問題。比如下圖中GC占用了16%的CPU。

Heap設置

Heap太小會導緻頻繁的GC,從而情景不難想象:增加GC會消耗更多的CPU,同時在GC時JVM會被凍結,最後導緻一個很

差的性能。總的來說,Heap太小的話,雖然GC時間變短,但是會變得更加頻繁。

Heap太大會導緻GC時間邊長。GC不會經常發生,但是一旦被觸發,那麽VM會被凍結很久。

因此,如果這種情況下發生内存洩露,在最終JVM因爲内存溢出崩潰之前,GC會非常頻繁或者時間特别長。

GC版本

從Java 6開始,GC就改變了很多。Java 7引入了G1GC作爲CMS GC的替代選擇,而在Java 9中G1GC已成爲默認選擇。Java 8中移除了PermGen Space,之前存儲在PermGen Space中的數據則改爲存儲在本地内存或者棧中。

后造成一个对象已经不能在堆区分足够空间. 注: 这种现象不能完全肯定是内存泄露, 比如: heap本身的设置的过小.

案例: 我个人没有遇到过这种案例, 但模拟过这种情形的Demo: 参考我的《深入浅出JProfiler》文章, 也学习过其他同学的案例: 例如:参数过大并且频繁超时导致内存泄露

解决方案:

触发FullGC, dump live heap. 标记堆中对象数量, 重点关注可疑对象

触发FullGC, dump live heap. 标记堆中对象数量, 重点关注可疑对象

对比步骤1和步骤2 相同对象的数量和大小, 找出可疑对象一一进行排查确认。

如果步骤3依然无法明确有问题的对象, 那就多执行几次步骤1和步骤2。在此过程中可以调整GC触发时间, 模拟真实的故障场景

看看GC后堆的大小是否增长, 如果没有不断增长, 并且持续一段较长时间, 那基本正常(具体看看。

java内存泄露怎么办

缩小问题的范围

要找出内存泄漏的原因当下已经有许多工具可用,比如JVisualVM或者jStat。这些工具是JDK自带的,所以大家随时都能用。除了要识别一些常用的内部Java类,一些用户自定义累同样需要识别。

性能优化

在日常的开发过程中,只要GC没有影响到性能,开发者就不会去关注内存设置于配置。从而埋下了在的隐患:因为内存问题并不只有溢出和泄露,GC时间过长同样会造成这个问题。比如下图中GC占用了16%的CPU。

Heap设置

Heap太小会导致频繁的GC,从而情景不难想象:增加GC会消耗多的CPU,同时在GC时JVM会被冻结,最后导致一个很

差的性能。总的来说,Heap太小的话,虽然GC时间变短,但是会变得更加频繁。

Heap太大会导致GC时间边长。GC不会经常发生,但是一旦被触发,那么VM会被冻结很久。

因此,如果这种情况下发生内存泄露,在最终JVM因为内存溢出崩溃之前,GC会非常频繁或者时间特别长。

GC版本

从Java 6开始,GC就改变了很多。Java 7引入了G1GC作为CMS GC的替代选择,而在Java 9中G1GC已成为默认选择。Java 8中移除了PermGen Space,之前存储在PermGen Space中的数据则改为存储在本地内存或者栈中。

国家规定疫情减免房租了吗 2020疫情房租减免政策

疫情期间,房租会减免吗?其实,在疫情期间,我们可以看到很多新闻,有些中国好房东减免了所有的房租费,等疫情结束后再重新交房租,,这对于个人租户或企业来说,无疑是好消息,如果...[全文阅读]

刑侦日记根据什么改编的

TVB的悬疑剧一直深受大众的喜爱,而近期上映的刑侦日记更是汇聚了诸多熟悉的tvb演员,什么惠英红、王浩信啊。也正是因为这样网友们纷纷好奇刑侦日记是不是刑事侦缉档...[全文阅读]

科颜氏美白淡斑精华搓泥吗

科颜氏美白淡斑精华使用会搓泥和自己的肤质是有关系的,有可能是角质层没有定期做清理,也有可能是搭配的护肤品叠加太多,导致营养过剩,还有人担心科颜氏美白淡斑精华用...[全文阅读]

TF细黑管新色80口红试色,这支“断货王”终于有缎光质地了!

TF口红的80号色#impassioned堪称专柜断货王,颜色非常耐看,暖调红棕色非常高级、洋气。新出的细黑管的80号是缎光质地的,比哑光的会更奶油一些,质感感觉比纯哑光更迷人...[全文阅读]

ios15怎么退回14不用电脑

ios15系统并没有更新很多功能,而且很多人都不太系统这个版本,如果大家想退出旧版本,还是喜欢iOS14的话,也是可以降级的。那么,ios15降级绕过验证通道降14呢?一起来看看...[全文阅读]

良辰美景好时光梁辰陆景什么时候认出对方的

虽说时下很多播放的小甜剧都被大家喜爱,但是排在首位的便要数林一、徐璐主演的良辰美景好时光,但由于二人剧中本就在游戏中相熟,但是现实上却总是各种错过,于是良辰美...[全文阅读]

本文标题:java内存泄露的原因

本文链接:https://m.biqugena.com/zhishi/shiwan/373988.html

上一篇:眼睛中有血丝的原因

下一篇:脸部发红发热的原因

十万个为什么相关文章
更多十万个为什么文章

精选十万个为什么

经典知识分类阅读

十万个为什么热点