new一個Object對象佔用多少記憶體?,newobject對象佔用
/***************************************************
* TODO: description .
* @author: gao_chun
* @since: 2015-4-2
* @version: 1.0.0
* @remark: 轉載請註明出處
**************************************************/
Java的自動記憶體管理機制省卻了很多編碼工作,大大地提高了Java的生產力,而且JVM的效能也越來越好,特別是G1的出現,改善了記憶體回收中stop the world的狀況。
也許很多人都沒有考慮過這個問題,new一個Object對象到底佔用多少記憶體呢( Object obj = new Object() ) ?
這裡很明確的是obj是一個指向對象的引用,引用的長度決定了Java的定址能力,32位的JDK是4位元組,64位的JDK是8位元組。
因為obj對象沒有任何資料(field),會在堆上為它分配空間嗎?如果分配空間,裡面儲存了什麼內容?
以物件導向的思維來分析,對象封裝了資料和行為,是一個統一的整體,雖然obj對象沒有資料,但是有行為(Object類定義了12個方法)。當我們執行完new操作後,obj的值為堆記憶體的地址,既然obj都指向一塊記憶體了,說明是會在堆上為其分配空間的。
那麼分配的空間有多大,儲存了什麼內容呢?我在JVM規範和JAVA語言規範裡面沒有找到相關的描述,這可能是屬於JVM實現自由控制的範疇了。我們可以利用JDK內建的工具jvisualvm.exe來查看分配的空間有多大,至於存了什麼內容,現在還不清楚。
/** * 構造一個無任何欄位的Null 物件佔多少記憶體 * @author gao_chun */ public class EmptyTest { public static void main(String[] args) throws InterruptedException{ //加到集合中,使垃圾無法回收 List<EmptyObject> emptys = new ArrayList<>(); for(int i=0;i<100;i++){ emptys.add(new EmptyObject()); } //開啟jvisualvm,查看EmptyObject的大小為16位元組 Thread.sleep(60*1000); } private static class EmptyObject{} }
這裡面new不同的對象數(for迴圈次數),結果都是一樣,我的JDK是64位,8位元組是引用,8位元組是堆記憶體,總共是16位元組。如所示:
我們研究new一個Object對象佔多少記憶體可能沒什麼實際意義,因為我們在編程的時候就可以確定對象樹,基本可以確定對象大小,除了變長欄位,當然,變長欄位我們一般也會有長度限制。所以我們真正關心的是所有資料最終的大小,也就是資料庫的大小。
那麼這種沒有什麼實際意義的問題為什麼要研究呢?我覺得只能用三個字來形容:好奇心。好奇心是驅使我們研究技術的強大推力,當我們工作了很多年,尤其是在不重視技術的公司,我們對技術還有激情嗎?保持一顆敏感好奇的心,也許技術之路可以走的更長更遠。