java - JVM 在堆和缓冲池之外泄漏内存

标签 java memory-leaks jvm

我们有一个 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/

相关文章:

java - 文本和 JLabel

C - 使用 open() 和 fdopen() 时关闭文件的正确方法

java - JVM 性能指标

java - Play 框架应用的监控工具

java - 通过复制目录安装 JRE 是否会影响类数据共享 (CDS)?

java - 为什么 VisualVM float 实例似乎不包含其他类中的 float ?

java - 为什么我的快速求幂算法在 lambda 参数中出现 'cannot find symbol' 错误?

java - 正确实现 CompareTo

android - 创建一个全局 Toast 方法以在所有 Activity 中使用它?

c++ - char字符串长度和内存泄漏