java - 为什么这个java进程不释放内存?

标签 java memory memory-management heap-memory

我写了一个java应用程序,我在Fedora 24下运行了java进程。然后我检查了jconsole,发现它使用了大约5到10兆字节的内存。 垃圾收集的效果在图中也可见。

截图如下: jconsole screenshot

然后我检查了我的系统监视器,发现同一个进程 ID 有超过 100 兆字节的内存使用。

截图如下:

System Monitor screenshot

请告诉我为什么进程不释放未使用的内存?

有什么办法可以释放吗?

最佳答案

已用 堆和已分配 堆之间存在差异。图表中的蓝线是已用堆 - 有多少堆实际持有对象。没有显示的是分配的堆的大小——这个更大,通常更大,这样 JVM 就可以分配更多的对象而不会用完空间并且不必返回操作系统以获得更多内存(这是昂贵的).在您的情况下,系统显示的 100mb 中的一部分是 JVM 本身,但其中大部分可能已分配但未使用的堆。

当你运行 Java 程序而不指定你希望它使用的堆大小时,JVM 将尝试根据你的机器、操作系统、JVM 版本等找出一个合理的设置。当我刚刚在我的计算机上运行一个简单的 Hello World 时具有 16GB RAM 和 Java 8 的机器最初为堆分配了 256mb。显然远远超过它的需要!如果我想强制它使用更少,我可以使用 -Xms 命令行设置初始堆分配和 -Xmx 设置允许的最大值。我的猜测是,如果您设置类似 -Xms20m 的内容,您会发现您的进程使用的内存更少。在 IntelliJ 中,将该设置添加到运行配置中的 VM Options 字段。

关于java - 为什么这个java进程不释放内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38190585/

相关文章:

Java 程序作为 dist 构建比从 Netbeans 运行时慢

java - OS 4.0 上的 intent.putExtra() 错误 - 如何解决?

java - Java中的指针

c# - 获取用于内存映射的结构的大小

xcode - Xcode 的调试导航器没用吗?

javascript - Javascript 是否等号引用对象或克隆它们?

java - 有人可以告诉我我对 IntelliJ 做错了什么吗

java - JPA 多继承无法创建模式

c# - 为什么我的结构数组占用了这么多内存?

python - 拆分数组时减少内存使用的最佳实践