我在Tomcat中有一个Web应用程序,我在那里执行很多String操作(substring,indexof,trimming等)。我使用jmap进行了堆转储,然后使用VisualVM加载它,我意识到我的堆内存使用量的近50%是使用char [], 为什么char []正在占用内存?我应该担心吗?它是否与字符串池有关?
答案 0 :(得分:9)
字符串在内部只是一个char []和一些额外的数据。 char []表示字符数组,换句话说,它是一个按字符保存字符串的数组。如果你做了很多字符串处理,你的系统完全可能是带有字符数组的文件结构。
所以总之没有什么可担心的,除非你的系统实际上使用了更多的内存然后它应该是。在这种情况下,您可以查看是否有一些文件结构未清除(哈希映射或相关)。
答案 1 :(得分:3)
811k的char[]
对应800k的String
s,所以是的,你的字符串太多了。
如果您有内存泄漏(通过标记判断),那么它很可能是HashMap
中的字符串。你有800k个字符串实例,200k个哈希条目实例,30k个地图。这可能意味着您的字符串保留在此缓存中并且不会被删除。全局映射是内存泄漏的常见原因,需要确保它们从此缓存中被逐出。
由于所有这些值都没有进行GC编辑,因此您可以尝试使用JProfiler之类的工具分析对象图,以查看其中包含的内容。