为什么在我没有创建任何char []实例时,探查器会显示大量的char []实例?

时间:2009-12-31 13:48:55

标签: java profiling

我正在运行一个递归操作的NetBeans配置文件,其中包括创建一个带有java.lang.String字段的类。在类列表中,在配置文件堆转储中,String字段的数量对应于按预期创建的类的数量,但是也有类似数量的char[]实例。 char数组占内存使用量(!)的近70%,而String字段约占7%。

这里发生了什么?我怎样才能减少char[]个实例的数量?

由于

4 个答案:

答案 0 :(得分:13)

看看String source code。 String对象本身包含一个缓存的哈希码,一个字符数的计数(再次,为了优化目的),一个偏移量(因为String.substr()指向原始字符串数据)字符数组,包含实际的字符串数据。因此,您的指标显示String消耗相对较少,但大部分内存由基础字符数组占用。

答案 1 :(得分:4)

  

char数组占近70%   内存使用情况(!)虽然   字符串字段占约7%

这是记忆分析的微妙之处,称为“保留大小”和“浅大”:

  • 浅大小是指对象占用多少内存,不包括它包含的任何子对象。基本上,这意味着原始字段。
  • 保留大小是浅大小加上对象引用的其他对象的大小,但 仅由此对象引用的其他对象(棘手的解释,简单的概念)。

字符串就是一个很好的例子。它包含一些原始字段以及char[]char[]占据了绝大多数内存使用量。 String的浅层大小非常小,但它的保留大小要大得多,因为它包含char[]

NetBeans探查器可能会为您提供浅尺寸,这不是一个非常有用的数字,但很容易计算。保留的大小会将char[]内存使用量纳入String内存使用量,但计算保留的大小在计算上是昂贵的,因此在明确要求之前,分析器将无法正常工作。

答案 2 :(得分:2)

Sun的Java实现中的String类使用char[]来存储字符数据。

我相信通过使用调试器查看String的内容,或者使用反射来查看String对象的内部结构,可以在不查看源代码的情况下验证这一点。

因此,除非正在创建的char[]个实例的数量减少,否则很难减少正在创建的String的数量。

答案 3 :(得分:1)

字符串由char数组支持,所以我认为你不能减少char []实例的数量而不减少你的字符串。

您是否尝试删除一些字符串以查看char []是否也会关闭?