您如何判断堆转储中字符串与 char[] 的比率是否表明存在问题?

阿迪金森

应用程序超出了分配给它的预期内存量,堆转储中的前三个条目如下:

 num     #instances    #mb          class name
----------------------------------------------
 1:      11759890      465.61       [C
 2:       3659043      292.89       [Ljava.util.HashMap$Node;
 3:      11762204      282.29       java.lang.String

由于字符串由字符数组表示,因此预计会看到两者之间的相关性,在这种情况下,每个实例的数量非常相似,仅相差约 3000 个实例。
令人困惑的是两者的使用差异,因为 char[] 构成的字节比字符串多 50% 以上。
由于有问题的程序不直接包含 char 数组的实例,(尽管可能存在我忽略的依赖性),似乎 char 数组是唯一的来源,但由于内存使用,我不确定如果这是预期的。

就实例和内存使用而言,字符数组和字符串之间的预期比率是多少?在什么时候数据会表明两者之一发生泄漏?

霍尔格

在 Java 7,更新 6 之前,一个String实例包含对char[]数组和两个int字段的引用offset以及length. 再加上 HotSpot 至少两个字的 JVM 特定对象开销,它可以解释String统计数据中每个 24 字节的平均值

相比之下,char[]数组具有 JVM 特定的对象开销、存储的长度int可变大小的内容。因此,看到显着更大的内存使用量(例如char[]统计信息中显示的每个数组平均 40 字节)并不罕见。在不了解您特定 JVM 配置的更多信息的情况下,这有点猜测,但如果我们假设数组头有 16 个字节,包括长度和可能的填充,剩余的 24 个字节表明平均数组大小为 12char秒,这并非不合理。

从 Java 7 更新 6 开始, 的offsetlength字段String消失了,对于大多数配置,每个实例的大小应该减少到 16 字节,这可以为字符串实例节省大约 100MB。并且显着改变该比率,因此char[]实例在堆中占据更大的主导地位。

这就是为什么从 Java 9 开始,String实例只包含对byte[]数组的引用如果字符串仅由 iso-latin-1 字符组成,这适用于典型应用程序中的大量字符串,则每个字符将仅使用一个字节,将这些字符串的内存量减半(准确地说是它们的数组) . 由于还会有包含该字符集之外的字符的字符串,当然,保存不会完全像那样。但也许你的应用程序还有大约 100MB。

但是,假设上面猜测的平均字符串长度,这些数组使用的内存将明显大于字符串实例使用的内存,即使在最近的实现中也是如此。这是正常的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何确定字符串contanis是否为char?

来自分类Dev

检查char 2维数组中是否存在char

来自分类Dev

检查字符串中是否存在所有char值

来自分类Dev

如何在C ++中将字符串保存在数组char中?

来自分类Dev

如何检查字符串中是否仅包含制表符(\ t char)

来自分类Dev

如何判断字符是否在字符串中c ++

来自分类Dev

交换char数组的元素有效,但是交换char字符串的元素会导致核心转储

来自分类Dev

C ++中的“ char(a)”问题

来自分类Dev

C中的Char问题

来自分类Dev

C ++:旧的C风格的字符串数组存在问题(如Char **)

来自分类Dev

C ++:旧的C风格的字符串数组存在问题(如Char **)

来自分类Dev

具有Char的LinkedList(字符串问题

来自分类Dev

解码字符串Char.Parse问题

来自分类Dev

关于从char数组转换为字符串的问题-C ++

来自分类Dev

是否通过std :: wostream定义了char *字符串的输出?

来自分类Dev

查找char是否在子字符串之前

来自分类Dev

如何从字符串变量中动态判断对象是否存在

来自分类Dev

修复查询以解决Scala Databricks 2.4.3中的to_char和/或字符串比较问题

来自分类Dev

如何检查const char *是否以特定字符串开头?(C ++)

来自分类Dev

测试python中的字符串输入是否包含正确格式的正确char

来自分类Dev

readLine()是否将多余的char放在结果字符串中?

来自分类Dev

检查char是否在()块中

来自分类Dev

如何从bash中的字符串中删除char?

来自分类Dev

由c ++字符串类定义的字符串文字是否为const char []类型

来自分类Dev

由c ++字符串类定义的字符串文字是否为const char []类型

来自分类Dev

将字符串中的char文字转换为char

来自分类Dev

在 C11 中,字符串文字为 char[]、unsigned char[]、char* 和 unsigned char*

来自分类Dev

如何从char **中读取字符串?

来自分类Dev

如何在字符串中添加char [item]?

Related 相关文章

  1. 1

    如何确定字符串contanis是否为char?

  2. 2

    检查char 2维数组中是否存在char

  3. 3

    检查字符串中是否存在所有char值

  4. 4

    如何在C ++中将字符串保存在数组char中?

  5. 5

    如何检查字符串中是否仅包含制表符(\ t char)

  6. 6

    如何判断字符是否在字符串中c ++

  7. 7

    交换char数组的元素有效,但是交换char字符串的元素会导致核心转储

  8. 8

    C ++中的“ char(a)”问题

  9. 9

    C中的Char问题

  10. 10

    C ++:旧的C风格的字符串数组存在问题(如Char **)

  11. 11

    C ++:旧的C风格的字符串数组存在问题(如Char **)

  12. 12

    具有Char的LinkedList(字符串问题

  13. 13

    解码字符串Char.Parse问题

  14. 14

    关于从char数组转换为字符串的问题-C ++

  15. 15

    是否通过std :: wostream定义了char *字符串的输出?

  16. 16

    查找char是否在子字符串之前

  17. 17

    如何从字符串变量中动态判断对象是否存在

  18. 18

    修复查询以解决Scala Databricks 2.4.3中的to_char和/或字符串比较问题

  19. 19

    如何检查const char *是否以特定字符串开头?(C ++)

  20. 20

    测试python中的字符串输入是否包含正确格式的正确char

  21. 21

    readLine()是否将多余的char放在结果字符串中?

  22. 22

    检查char是否在()块中

  23. 23

    如何从bash中的字符串中删除char?

  24. 24

    由c ++字符串类定义的字符串文字是否为const char []类型

  25. 25

    由c ++字符串类定义的字符串文字是否为const char []类型

  26. 26

    将字符串中的char文字转换为char

  27. 27

    在 C11 中,字符串文字为 char[]、unsigned char[]、char* 和 unsigned char*

  28. 28

    如何从char **中读取字符串?

  29. 29

    如何在字符串中添加char [item]?

热门标签

归档