簡體   English   中英

Java 8 中的字符串使用多少內存?

[英]How much memory does a string use in Java 8?

我最近閱讀了很多關於字符串內存分配的內容,如果 Java 8 的情況相同,則找不到任何詳細信息。

"Alexandru Tanasescu"這樣的字符串在 Java 8 中會使用多少內存空間? 我使用的是 64 位版本。

Java7或更低

最小字符串內存使用量:

(bytes) = 8 * (int) ((((no chars) * 2) + 45) / 8)

所以

80 = 8 * (int) ((((19) * 2) + 45) / 8)

了解字符串內存使用情況( SOURCE )

要理解上述計算,我們需要從查看 String 對象上的字段開始。 一個字符串包含以下內容:

  • 一個包含實際字符的 char 數組——因此是一個單獨的對象;
  • 字符串開始的數組中的整數偏移量;
  • 字符串的長度;
  • 另一個用於緩存計算哈希碼的 int。

這意味着即使字符串不包含字符,它也需要 4 個字節用於 char 數組引用,加上 3*4=12 個字節用於三個 int 字段,再加上 8 個字節的對象頭。 這給出了 24 個字節(這是 8 的倍數,因此到目前為止不需要“填充”字節)。

然后,(空)char 數組將需要另外 12 個字節(數組有額外的 4 個字節來存儲它們的長度),在這種情況下加上 4 個字節的填充,以使 char 數組對象使用的內存達到16. 因此,一個空字符串總共使用 40 個字節。

如果String包含 19 個字符,那么 String 對象本身仍然需要 24 個字節。 但是現在 char 數組需要 12 個字節的標題加上 19*2=38 個字節的 17 個字符。 由於 12+38=50 不是 8 的倍數,我們還需要四舍五入到下一個 8 的倍數 (56)。 所以總的來說,我們的 19 個字符的String將使用 56+24 = 80 個字節。


Java8。

Java 8 不再有offsetlength 只有hashCharArray
@Thomas Jungblut

  • 一個包含實際字符的 char 數組——因此是一個單獨的對象;
  • 字符串開始的數組中的整數偏移量;
  • 字符串的長度;
  • 另一個用於緩存計算哈希碼的 int。

因此,在 Java8 中,計算字符串內存的方式保持不變,但由於缺少offsetlength ,您必須少減去 8 個字節。

如果您查看 Oracle Java 8 源代碼,您會發現:

一個char value[]和一個int hash 一個char是 2 個字節,一個int是 4 個字節。

那么答案不是yourstring.length * 2 + 4 嗎?

不,每個對象都有開銷。 例如,數組存儲其維度。 並且數組(一個對象)和字符串都會從垃圾收集器中產生額外的內存來存儲有關它們的信息。

沒有可靠的方法來計算這一點,因為 AFAIK 每個 JRE 和 JDK 對對象開銷的大小沒有義務。

“Alexandru Tanasescu”使用 104 個字節。 這是如何獲得大小

    long m0 = Runtime.getRuntime().freeMemory();
    String s = new String("Alexandru Tanasescu");
    long m1 = Runtime.getRuntime().freeMemory();
    System.out.println(m0 - m1);

注意:使用 -XX:-UseTLAB 選項運行它

根據以下JEP:http: //openjdk.java.net/jeps/254

String 類的當前實現將字符存儲在 char 數組中,每個字符使用兩個字節(16 位)。

在 Java SE 9 中,這可能會改變。

但是請注意,由於這是 JEP 而不是 JSR(並且它提到了實現),我理解這是特定於實現的,而不是由 JLS 定義的。

暫無
暫無

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

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