簡單的方法,如下:
Runtime r = Runtime.getRuntime(); r.gc(); long startMem = r.freememory(); // 開始時的剩餘記憶體 你的代碼…… long orz = startMem - r.freememory(); // 剩餘記憶體 現在
但這當然不夠精确,尤其是“你的代碼”足夠多的時候。
那要怎麼樣做才能夠精确呢?使用,java.lang.instrument ,當然,
剩下的,思路就是:
在啟動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個位元組。
本文轉自最課程陸敏技部落格園部落格,原文連結:http://www.cnblogs.com/luminji/p/7296265.html,如需轉載請自行聯系原作者