2012-07-19 55 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[]

相关问题