[英]size of java byte[] in memory
所以我創建了一個非常大的 byte[] 數組,比如 byte[50,000,000][16].. 所以根據我的數學計算,這是 800,000,000 字節,即 0.8GB 加上一些開銷。 令我驚訝的是什么時候做
memoryBefore = runtime.totalMemory() - runtime.freeMemory()
它使用 1.8GB 的內存。 當我用探查器指向它時,我得到了這個
https://www.dropbox.com/s/el9vlav5ylg781z/Screen%20Shot%202015-08-30%20at%202.55.00%20pm.png?dl=0
我可以看到大多數字節 [] 是 24 字節而不是預期的 16 字節,並且我看到了很多更大的字節 [] 大小為 472 或更多.. 有誰知道這里發生了什么?
謝謝閱讀
所有對象都有維護對象的開銷,例如“類型”即Class
。 請參閱Java 中對象的內存消耗是多少? .
數組也有一個length
,在 64 位 Java 中開銷可能更大。
由於您要分配 50,000,000 個 16 字節的數組,因此您將獲得50_000_000 * (16 + overhead) + (overhead + 50_000_000 * pointerSize)
。 第二部分是數組的外部數組。
根據您的要求,您可以通過以下兩種方式之一進行改進:
將二維數組的索引翻轉到byte[16][50_000_000]
。 這將開銷從 50,000,001 減少到 17,並減少了外部陣列的大小。
使用單個數組byte[16 * 50_000_000]
並自己做偏移邏輯。 這將使您的 16 個字節保持連續並消除所有開銷。
我可以看到大多數字節 [] 是 24 字節而不是 16
Java 中的對象除了包含對象字段的空間外,還有幾個字的頭信息。 在數組的情況下,還有一個額外的字來保存數組的length
字段。 length
實際上需要 4 個字節('cos length
是一個int
),但 JVM 很可能與您平台上的 8 個字節邊界對齊。
如果您看到 16 字節數組占用 24 字節,那么空間的計算很可能包括(僅) length
字。
(請注意,對象/數組頭占用的實際空間是特定於 JVM 和平台的。)
...我看到了相當多的大小為 472 或更大的 byte[]。
那些是無關的。 如果代碼的其他部分沒有明確創建它們,它們很可能是由 Java 運行時庫創建的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.