有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

内存不足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

只有一个类来自我的应用程序ph.com.my.class.Person。该类定义如下:

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

在堆转储中,Person size (11789056)是否包含两个字符串变量占用的内存?或者将f_namel_name计算在String类中,在本例中是57412368

更新-添加了后续问题:

让我们假设以下每一个例子:

  1. f_的名字大小是30
  2. l_name尺码是20码
  3. 人数为75人

如果有10个人的例子,就会有

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

500是用字符串还是字符[]计算的?随后,750人会被计算在内吗


共 (1) 个答案

  1. # 1 楼答案

    堆转储中对象的大小是在堆上作为块分配以容纳该实例的字节数。它从不包含可通过对象访问的整个图形的字节。一般来说,这很容易意味着对象的大小就是整个堆。因此,在您的例子中,它考虑了两个引用,而不是字符串实例本身。还要注意的是,即使是String大小也不能反映char[]中存储的所表示字符串的大小。char[]实例是在字符串之间共享的,所以故事并没有那么简单