【发布时间】:2017-06-10 20:16:05
【问题描述】:
我们有一个 java 应用程序作为长期运行的服务(这个 JVM 的实际正常运行时间为 31 天 3 小时 35 分钟)
由于 Windows 任务管理器,该进程使用 1,075,384,320 B - 将近 1 GB。
JVM 的堆大小限制为 256 MB (-Xmx256m)
内存数据
Memory:
Size: 268,435,456 B
Max: 268,435,456 B
Used: 100,000,000 up to 200,000,000 B
- 这里没有泄漏
缓冲池
Direct:
Count: 137
Memory Used and Total Capacity: 1,348,354 B
Mapped:
Count: 0
Memory Used and Total Capacity: 0 B
- 这里没有泄漏
我的问题:JVM在哪里使用额外的内存?
其他信息:
Java: version 1.8.0_74 32 bit (Oracle)
Classes:
Total loaded: 17,248
Total unloaded: 35,761
Threads:
Live: 273
Live peak: 285
Daemon: 79
Total started: 486,282
重新启动后,进程大小需要几天时间才能增长,因此定期重新启动当然会有所帮助,也许使用较新的 java 版本也可以解决问题,但我想对此行为进行解释, e. G。 111 之前的 1.8.0 中的已知错误,已修复... - 我还没有找到任何东西。
我们在不同的地方使用了大约 350 个这样的装置,所以改变不是那么容易。
【问题讨论】:
-
用 jvisualvm 看看使用的内存。您可以在 JDK_HOME/bin 中找到它。然后,您可以计算类的活动实例。
-
以上数据你觉得我去哪儿了?
-
如您所见,加载的类是 17.248;元空间消耗大约 58 M。
-
试试docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/…和(假设是linux)
pmap -
@the8472:感谢您的提示,我也找到了这个工具集。目前我正试图了解结果。我当前进程中的本机内存分析声称总共使用了比 taskmanager 显示的更多的内存。
标签: java memory-leaks jvm