Eclipse Memory Analyzer 分析記憶體泄露

來源:互聯網
上載者:User

標籤:des   style   blog   http   color   java   os   io   

OutOfMemoryError範例程式碼

package com.walson.heap;

import java.util.ArrayList;
import java.util.List;


/**
 * java 堆溢出
 *
 * -verbose:gc -Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError
 * @author gjh1
 *
 */
public class HeapOOM {

    static class OOMObject{
        
    }
    
    public static void main(String[] args) {
        List<OOMObject> list = new ArrayList<HeapOOM.OOMObject>();
        
        while (true) {
            list.add(new OOMObject());
            
        }
    }

}

java虛擬機器設定

 

說明:

  1. -Xms:最小堆記憶體
  2. -Xmx:最大堆記憶體
  3. 設定-Xms與-Xmx一樣都為20M是為了避免堆記憶體知道擴充
  4. -XX:+HeapDumpOnOutOfMemoryError :虛擬機器出現記憶體溢出異常時Dump出當前的記憶體堆轉儲快照以便事後分析。(專案檔夾下)
運行結果[GC (Allocation Failure) 5504K->3237K(19840K), 0.0108051 secs][GC (Allocation Failure) 8741K->7223K(19840K), 0.0123580 secs][GC (Allocation Failure) 12727K->12727K(19840K), 0.0179589 secs][Full GC (Allocation Failure) 18231K->12016K(19840K), 0.0451467 secs][Full GC (Allocation Failure) 14714K->14711K(19840K), 0.0540938 secs][Full GC (Allocation Failure) 14711K->14691K(19840K), 0.0588749 secs]java.lang.OutOfMemoryError: Java heap spaceDumping heap to java_pid4352.hprof ...Heap dump file created [26506297 bytes in 0.267 secs] 

說明:回收前Heap堆佔用大小-->回收後佔用大小(堆空間大小)最後是耗時多久(秒)

 

分析記憶體泄露Memory Analyzer外掛程式的安裝

首先,開啟eclipse->Help->Install new software->work with右邊的Add...

彈出的對話方塊如下

在Name框中輸入名稱,location中輸入如下地址:

 http://download.eclipse.org/mat/1.2/update-site/

這個地址安裝的版本是1.2.1。

具體版本為http://www.eclipse.org/mat/downloads.php。

點擊確定就好。


確定了之後,出現了選擇安裝的介面。選擇全部即可。進行下一步一路next下去即可。

 

分析dump檔案開啟堆記憶體轉儲檔案

餅圖分析

 

從餅圖可以看出整個heap14.3M,深色地區佔了13.9M,佔94.71%,懷疑深色地區為記憶體泄露對象。下面描述The memory is accumulated in one instance of "java.lang.Object[]" loaded by "<system class loader>".大概是說深色地區的記憶體系統類別載入器用來累積載入Object數組

詳細分析

 

Dominator Tree為對象關係樹形圖

Shallow Heap與Retained Heap的計算

Shallow size就是對象本身佔用記憶體的大小,不包含對其他對象的引用,也就是對象頭加成員變數(不是成員變數的值)的總和。在32位系統上,對象頭佔用8位元組,int佔用4位元組,不管成員變數(對象或數組)是否引用了其他對象(執行個體)或者賦值為null它始終佔用4位元組。故此,對於String對象執行個體來說,它有三個int成員(3*4=12位元組)、一個char[]成員(1*4=4位元組)以及一個對象頭(8位元組),總共3*4 +1*4+8=24位元組。根據這一原則,對String a=”rosen jiang”來說,執行個體a的shallow size也是24位元組。

 

Retained size是該對象自己的shallow size,加上從該對象能直接或間接訪問到對象的shallow size之和。換句話說,retained size是該對象被GC之後所能回收到記憶體的總和。為了更好的理解retained size,不妨看個例子。

把記憶體中的對象看成中的節點,並且對象和對象之間互相引用。這裡有一個特殊的節點GC Roots,正解!這就是reference chain的起點。

 

從obj1入手,中藍色節點代表僅僅只有通過obj1才能直接或間接訪問的對象。因為可以通過GC Roots訪問,所以左圖的obj3不是藍色節點;而在右圖卻是藍色,因為它已經被包含在retained集合內。

所以對於左圖,obj1的retained size是obj1、obj2、obj4的shallow size總和;右圖的retained size是obj1、obj2、obj3、obj4的shallow size總和。obj2的retained size可以通過相同的方式計算。

 

找出記憶體泄露代碼

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.