【发布时间】:2021-04-03 07:07:43
【问题描述】:
我有一个运行了好几天的 Java 程序,它处理传入的消息并将它们转发出去。
我今天注意到的一个问题是,我通过 Runtime.totalMemory() 打印的堆大小仅显示 ~200M,但 top 命令中的 RES 列显示它占用了 1.2g RAM。
程序没有使用直接字节缓冲区。
我如何找出 JVM 占用这么多额外 RAM 的原因?
其他一些信息:
- 我正在使用 openjdk-1.8.0
- 我没有设置任何JVM选项来限制堆大小,启动命令很简单:java -jar my.jar
- 我尝试使用jcmd进行堆转储,转储文件大小只有15M左右。
- 我试过pmap ,但是好像打印的信息太多,不知道哪个有用。
【问题讨论】:
-
JVM 可能没有将之前分配的内存释放回操作系统。
-
意思是JVM已经收缩了堆,但它仍然持有收缩的空间?它何时将其释放回操作系统? :)
-
这取决于 JVM 版本和配置。我建议您考虑至少迁移到 java 11。
标签: java heap-memory ram