为什么我的Java堆有这么多字符[]

2022-09-04 21:40:28

我在Tomcat中有一个Web应用程序,在那里我做了很多字符串操作(子字符串,索引,修剪等)。我用jmap做了一个堆转储,我用VisualVM加载了它,我意识到我的堆内存使用率中有近50%是char[],为什么char[]占用了该内存使用量?,我应该担心吗?,它与字符串池有关吗?enter image description here


答案 1

字符串在内部只是一个字符[]和一些额外的数据。char[]表示字符数组,换句话说,它是一个逐个字符保存字符串的数组。如果你做了很多字符串处理,那么你的系统完全有可能是用char数组提交的。

因此,简而言之,除非您的系统实际上使用了更多的内存,否则没有什么可担心的。在这种情况下,您可以查看是否有一些文件结构未清除(哈希映射或相关)。


答案 2

811k 对应于 800k 的 s,所以是的,你有太多的字符串。char[]String

如果您遇到内存泄漏(根据标记判断),则很可能是 .您有 800k 个字符串实例、200k 个哈希条目实例、30k 个映射实例。这可能意味着您的字符串将保留在此缓存中,并且不会被删除。全局映射是内存泄漏的常见原因,需要确保它们从此缓存中逐出。HashMap

由于所有这些值都没有经过GC编辑,因此您可以尝试分析对象图,以查看使用JProfiler等工具保存它们的内容。


推荐