【发布时间】:2016-05-27 19:12:24
【问题描述】:
我工作的公司构建 Java“企业软件”:大型、复杂且通常设计和维护不完善的软件。我们经常遇到内存泄漏问题,这些问题在数小时甚至数分钟内就会显现出来。这些内存泄漏通过正常监控内存使用情况并在变得严重时进行堆转储时清晰可见。
根据我们的监控,它看起来也在很长一段时间内(数周甚至数月)缓慢地泄漏内存。单个内存转储无法提供关于内存泄漏的位置以及随着时间的推移如何发展的深入信息。
所以我正在寻找某种工具,它可以定期生成/提供当前驻留在堆中的每个类的数量实例的报告。就像jmap -histo 可以提供的一样。但由于这应该在生产实例上定期运行,它的开销应该很低,并且不会冻结 JVM。
2GiB 的活动堆和 27K 类的 29M 实例并不少见。
【问题讨论】:
-
我想每周日凌晨 2 点重新启动应用程序的通常“企业级”解决方案不可行?
-
没有任何开销就无法监控此信息。开销最低的工具是飞行记录器,尽管这需要生产许可证。
-
@Thilo 我更喜欢实际解决问题。考虑到它泄漏的速度非常慢,它很少会泄漏足够长的时间而成为问题,因为服务器会接受定期维护,因此每个月或两个月重新启动并不奇怪。
标签: java memory-leaks heap-memory