2012-07-19 17 views
4

鑑於這種堆轉儲什麼是Java堆的統計數據的轉儲擊穿

size   no. of obj class 
515313696  2380602 char[] 
75476832  614571 * ConstMethodKlass 
57412368  2392182 java.lang.String 
44255544  614571 * MethodKlass 
33836872  70371 * ConstantPoolKlass 
28034704  70371 * InstanceKlassKlass 
26834392  349363 java.lang.Object[] 
25853848  256925 java.util.HashMap$Entry[] 
24224240  496587 * SymbolKlass 
19627024  117963 byte[] 
18963232  61583 * ConstantPoolCacheKlass 
18373920  120113 int[] 
15239352  634973 java.util.HashMap$Entry 
11789056  92102 ph.com.my.class.Person 

而且只有1類是從我的應用程序,ph.com.my.class.Person。類定義如下:

public class Person { 
private String f_name; 
private String l_name; 
} 

在堆轉儲,並在Person size (11789056)包括2個字符串變量佔用的內存?或者將f_namel_name改爲在String類中計數,在這種情況下,尺寸爲57412368?

更新 - 添加後續問題:

所以我們說的每個實例:

  1. f_name大小爲30
  2. l_name大小20
  3. 人大小爲75

如果有10個Person的實例,那裏有升是

  1. 10 *(30 + 20)= 500
  2. 10 * 75 = 750

請問500可以以字符串計數或燒焦[]?並且隨後,750人會被計入嗎?

回答

2

堆轉儲中對象的大小是分配爲堆中的塊以容納該實例的字節數。它從不包含可通過對象訪問的整個圖形的字節。一般來說,這很容易意味着對象的大小是整個堆。所以在你的情況下,它考慮到兩個引用,但不是String實例本身。還請注意,即使String大小也不反映代表字符串的大小 - 存儲在char[]中。 char[]實例是字符串之間共享,所以故事不是那麼簡單。

2

每個計數和大小是該對象的大小。如果您使用-histo而不是-histo:live,這將是所有對象,即使是未引用的對象。

注意:每個String都有一個char[],JVM使用了其中的幾個。 String大小是對象本身的大小,而不是其大小char[]