1. 程式人生 > >如何看一段JAVA程式碼耗了多少記憶體

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

簡單的方法,如下:

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個位元組。