簡體   English   中英

JVM需要分配多少內存來分配一個字符數組?

[英]Home much memory does the JVM need to allocate a character array?

考慮以下 1 行程序:

public static void main(String[] args) throws Exception {
    // 134217728 * 2 bytes / 1024 / 1024 = 256M
    char[] array = new char[134217728]; 
}

JVM 需要多少內存來分配這個 256M 的字符數組?

原來答案是-Xmx384m。 現在讓我們嘗試 512M 字符數組...

// 268435456 * 2 bytes / 1024 / 1024 = 512M
char[] array = new char[268435456]; 

答案似乎是 -Xmx769m。

在運行一些大小為 m 的字符數組的示例時。 jvm 至少需要 1.5m 兆字節的內存來分配數組。 這似乎很多,誰能解釋一下這里發生了什么?

我相信您正在觀察Oracle JVM 分配內存的方式

特別是,整個陣列必須適合一個“世代”。 默認情況下,老年代的大小是新生代的兩倍——這意味着每增加 3MB,老年代只能獲得 2MB 的額外空間。 如果更改比率,則可以以較小的總大小分配 char 數組。 例如,這對我來說適用於您的 512MB 陣列:

java -Xmx530M -XX:NewRatio=50 Test

順便說一句,您會看到與字節數組完全相同的效果,然后您無需擔心將數組的長度加倍以獲得以字節為單位的大小。 (類引用和長度的常量開銷很小,但顯然這是微不足道的。)

環境本身需要一點空間,正如在一條評論中所說,它取決於使用的 JVM 和編譯器(OpenJdk 或 Oracle,java 6/7/8)。 總而言之,它應該以大小為導向:Character.SIZE * array.length。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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