我们有一个 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 版本也可以解决问题,但我想对此行为有一个解释,例如。 G。 111 之前的 1.8.0 中的已知错误,已修复... - 我还没有发现任何内容。
我们在不同的地方使用了大约 350 个这样的装置,因此更改并不那么容易。
最佳答案
Don't forget to run your JVM in server mode on long running tasks!
造成这种内存泄漏的原因是 JVM 以客户端模式运行。 我们的解决方案在几家链式店的旧 Windows XP 32 位 PC 上运行。 该平台上的 JVM 默认为客户端模式。
在大多数情况下,我们运行 JRE 1.8.0_74-32 位。在我们的应用程序中,这个 JVM 泄漏了“Thread Arena Space”中的内存 - 似乎没有返回任何内容。
通过在 JVM 启动上设置参数 -server
切换到服务器模式后,问题消失了。
关于java - JVM 在堆和缓冲池之外泄漏内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41855168/