作为 jsvc 运行的 Java 应用程序使用的内存比 Heap+PermGen 更多

标签 java memory heap-memory jsvc

我有以下服务器:

  • Ubuntu 服务器 12.04 LTS 64 位
  • 没有 GUI,只有命令行
  • 4GB 内存
  • 2 核
  • 除了 Nagios NRPE 和 Webmin 之外,没有其他程序在运行
  • vm.swappiness = 0

这里没什么特别的,运行一个 Java 应用程序:

  • 使用 jsvc 作为守护进程 24/7 运行
  • -Xmx2500M
  • -XX:+UseConcMarkSweepGC
  • 未进行其他设置
  • 使用 OpenJDK 7
  • 已启用 JMX 服务器,并由 nagios 每分钟检查

但是,这不应耗尽所有内存并导致 java 应用程序无法通过 JMX 响应 nagios。

为什么这会耗尽我所有的内存并创建 SWAP?

最佳答案

您的 -Xmx2500M 是 java 应用程序内可用的最大堆大小。运行 JVM 和管理该堆中的对象的开销通常要多 50%,但可能是堆大小的两倍。 Linux top 命令会显示虚拟内存的使用情况。

有关非堆内存使用的详细讨论可以在链接 here 的演示文稿中找到。 。 关于这个主题还有另一个线程 here

您可以在 ubuntu 上使用 OpenJDK 进行的一项快速检查是运行 jps 以查看它是哪个进程 ID,然后运行 ​​jconsole,选择内存选项卡,然后选择非堆内存使用。

如果您尝试在没有交换的情况下运行,我的猜测是您将需要尝试不同的堆大小,以了解您的应用程序可以运行的场景。 。

关于作为 jsvc 运行的 Java 应用程序使用的内存比 Heap+PermGen 更多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19293499/

相关文章:

java - 数组的累积和

java - Android Firebase - 是否可以在 startAt() 和 endAt() 之间使用 limitToFirst()/limitToLast()

java - 标记语法错误,错误放置的结构

memory - 将字符串转换为 &strs 时,切片和显式重新借用之间有区别吗?

java - Elasticsearch OutOfMemoryError Java 堆空间

java - 如何在Java Android Studio中使用Android相机拍照错误

linux - 如何从 Linux 中的用户空间访问物理地址?

c++ - 如果它是针对 vector 中的对象,是否会调用析构函数?

java - 引用对象的实例变量

reactjs - 打包时如何减少 React 应用程序构建时间和理解 webpack 的行为