为什么 Intellij 关闭项目后不释放内存?

jav*_*dba 7 intellij-idea

我打开了三个项目。其中之一——Spark——非常大。关闭 spark 后,内存使用量没有差异 - 正如 os/x 活动监视器报告的那样。注意:所有项目都在同一个 Intellij 实例中打开。

在此处输入图片说明

事实上,它只使用了 4GB 多一点。我现在只有两个项目打开。如果我关闭 Intellij 并重新启动它,这两个项目仅占用 1.5GB。

那么..如何“鼓励”Intellij 释放它正在使用的内存?它运行得很慢(例如跟不上我的打字速度)

更新我刚刚关闭了剩下的两个项目中较大的一个。仍然没有减少内存使用。剩下的项目是一个单独的 python 文件。所以此时 Intellij 应该在 512Meg 下使用!

jav*_*dba 5

跟进@PeterGromov 的回答,似乎很难恢复记忆。此外@KevinKrumwiede 提到了XX:MaxHeapFreeRatio这似乎是一条大道。

这里有一些想法与GC 是否将内存释放回操作系统有点远

HotSpot JVM 确实将内存释放回操作系统,但这样做是不情愿的。

您可以通过设置 -XX:GCTimeRatio=19 -XX:MinHeapFreeRatio=20 -XX:MaxHeapFreeRatio=30 使其更具侵略性,这将允许它花费更多的 CPU 时间来收集和限制分配但未使用的堆内存量一个GC循环。

此外,Java 9 -XX:-ShrinkHeapInSteps 选项可用于更积极地应用由前两个选项引起的收缩。相关的 OpenJDK 错误。

请注意,收缩能力和行为取决于选择的垃圾收集器。例如,G1 仅通过 jdk8u20 获得了返回堆中间未使用块的能力。

因此,如果需要堆收缩,应该针对特定的 JVM 版本和 GC 配置进行测试。

以及如何在 Java 中释放内存?

为了扩展 Yiannis Xanthopoulos 和 Hot Licks 的回答和评论(抱歉,我还不能发表评论!),您可以像下面这样设置 VM 选项:

-XX:+UseG1GC -XX:MinHeapFreeRatio=15 -XX:MaxHeapFreeRatio=30 在我的 jdk 7 中,如果虚拟机空闲时 GC 后超过 30% 的堆变为空闲,这将释放未使用的虚拟机内存。您可能需要调整这些参数。

虽然我没有在下面的链接中看到强调它,但请注意,某些垃圾收集器可能不遵守这些参数,并且默认情况下,如果您碰巧有多个核心(因此上面的 UseG1GC 参数),java 可能会为您选择其中之一)。

我将添加 -XX:MaxHeapFreeRatio到 IJ 并报告是否有帮助。

我们的应用程序目前只在 Java7 上运行,所以上面的第一种方法尚不可行 - 但有希望,因为我们的应用程序很快就会转移到 jdk8。