特黄特色三级在线观看免费,看黄色片子免费,色综合久,欧美在线视频看看,高潮胡言乱语对白刺激国产,伊人网成人,中文字幕亚洲一碰就硬老熟妇

學習啦>知識大全>原因大全>

java內存泄露的原因

時間: 曾揚892 分享

  內存泄漏大家都不陌生了,那么java內存泄露的原因是什么呢?下面是學習啦小編精心為你整理的java內存泄露的原因,一起來看看。

  java內存泄露的原因

  java內存泄露典型特征

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

  現象二:每次FullGC后, 堆/Perm 區(qū)在慢慢的增長, 最后不斷觸發(fā)FullGC, 甚至crash。

  java內存泄露場景---PermGen space

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

  案例: Groovy動態(tài)編譯class, xstream String.intern

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

  解決方案:

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

  用JProfiler來trace String.intern方法棧

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

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

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

  java內存泄露場景---Java heap space

  原因:長生命周期的對象引用了短生命周期(應該盡快GC回收掉)的對象,最后造成一個對象已經不能在堆區(qū)分配足夠空間. 注: 這種現象不能完全肯定是內存泄露, 比如: heap本身的設置的過小.

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

  解決方案:

  觸發(fā)FullGC, dump live heap. 標記堆中對象數量, 重點關注可疑對象

  觸發(fā)FullGC, dump live heap. 標記堆中對象數量, 重點關注可疑對象

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

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

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

  java內存泄露怎么辦

  縮小問題的范圍

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

  性能優(yōu)化

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

  Heap設置

  Heap太小會導致頻繁的GC,從而情景不難想象:增加GC會消耗更多的CPU,同時在GC時JVM會被凍結,最后導致一個很差的性能。總的來說,Heap太小的話,雖然GC時間變短,但是會變得更加頻繁。

  Heap太大會導致GC時間邊長。GC不會經常發(fā)生,但是一旦被觸發(fā),那么VM會被凍結很久。

  因此,如果這種情況下發(fā)生內存泄露,在最終JVM因為內存溢出崩潰之前,GC會非常頻繁或者時間特別長。

  GC版本

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

java內存泄露的原因相關文章:

1.造成內存泄露的原因

2.c內存泄露的原因

3.javaweb常見面試題及參考答案

java內存泄露的原因

內存泄漏大家都不陌生了,那么java內存泄露的原因是什么呢?下面是學習啦小編精心為你整理的java內存泄露的原因,一起來看看。 java內存泄露的原因 java內存泄露典型特征 現象一:堆/Perm 區(qū)不斷增長, 沒有下降趨勢(回收速度趕不上增長速
推薦度:
點擊下載文檔文檔為doc格式
3068630