簡體   English   中英

內存中java字節[]的大小

[英]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) 第二部分是數組的外部數組。

根據您的要求,您可以通過以下兩種方式之一進行改進:

  1. 將二維數組的索引翻轉到byte[16][50_000_000] 這將開銷從 50,000,001 減少到 17,並減少了外部陣列的大小。

  2. 使用單個數組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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM