我正在运行一个递归操作的NetBeans配置文件,其中包括创建一个带有java.lang.String
字段的类。在类列表中,在配置文件堆转储中,String字段的数量对应于按预期创建的类的数量,但是也有类似数量的char[]
实例。 char数组占内存使用量(!)的近70%,而String字段约占7%。
这里发生了什么?我怎样才能减少char[]
个实例的数量?
由于
答案 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 []是否也会关闭?