天天看點

如何看一段JAVA代碼耗了多少記憶體

簡單的方法,如下:

Runtime r = Runtime.getRuntime(); 

r.gc(); 

long startMem = r.freememory(); // 開始時的剩餘記憶體 

你的代碼……

long orz = startMem - r.freememory(); // 剩餘記憶體 現在

但這當然不夠精确,尤其是“你的代碼”足夠多的時候。

那要怎麼樣做才能夠精确呢?使用,java.lang.instrument ,當然,

首先,我們得會用這個instrument類,參考文章:

https://www.ibm.com/developerworks/cn/java/j-lo-jse61/index.html

其次,已經有強人為我們寫好了計算單個對象占用記憶體大小的api,位址:

http://www.jroller.com/maxim/entry/again_about_determining_size_of

剩下的,思路就是:

在啟動Java程序的時候把上文中寫好的這個agent作為參數放進去,然後getObjectSize()方法可擷取單個對象的大小,我們自己再通過反射逐個成員,對其進行getObjectSize(),然後所有的size求和。

最後,還要知道的一點知識是:

一個執行個體化的對象在記憶體中需要存儲的資訊包括:

    對象的頭部(對象的GC資訊,hash值,類定義引用等)

    對象的成員變量: 包括基本資料類型和引用。 如成員變量是一個引用, 引用了其他對象,被引用的對象記憶體另外計算。

對象大小分為:

    自身的大小(Shadow heap size)

    所引用的對象的大小(Retained heap size)。

基本資料類型大小如下:

type    size(bits)    bytes

boolean    8          1

byte         8          1

char         16        2

short       16        2

int           32        4

long         64        8

float         32        4

double      64        8

在32位的JVM上,一個對象引用占用4個位元組;在64位上,占用8個位元組。

如何看一段JAVA代碼耗了多少記憶體

本文基于

Creative Commons Attribution 2.5 China Mainland License

釋出,歡迎轉載,演繹或用于商業目的,但是必須保留本文的署名

http://www.cnblogs.com/luminji

(包含連結)。如您有任何疑問或者授權方面的協商,請給我留言。