我正在处理的Web应用程序(servlet)中发生内存泄漏。我对1个原因感到怀疑,并想听听您对此的想法。
我将哈希图,哈希集等用作数据库(已加载约20MB数据)。这些地图集每10分钟重新加载一次。有大量同时请求。我读到,GC将在一段时间/周期内未收集的对象传递给较少检查或收集垃圾的一代(旧世代和永久世代)。我认为我对静态地图,集合的使用导致我出现泄漏问题。你怎么看 ?
最佳答案
如果删除了所有对它的引用,则不是泄漏。如果您要彻底清除地图,则不是泄漏的根源。您应该考虑以下事实,即JVM选择不与您无关的GC终身制的频率非常高-重要的是您没有对其的引用,因此JVM可以对其进行GC。
JVM可以使用不同的策略来管理GC,因此这里我讲的不是一般性,而是一般性的,但是GCing占位空间往往非常昂贵,并且对应用程序影响很大,因此JVM选择不这样做。通常情况下。
如果查看使用的堆空间量,则会看到添加项目并最终收集项目时出现的锯齿状模式。不必担心锯齿的顶部在哪里,而不必担心锯齿的顶部在哪里(以及与可用堆空间的最大量有多接近)。
测试它是否真的是泄漏的一种方法是对应用程序进行长时间的负载测试。如果发生泄漏,则应用程序正在使用的基本内存量会随着时间(锯齿的底部)增加。如果您不这样做,它将保持不变。如果确实有泄漏,则可以使用探查器来帮助您找到它。