Eclipse将堆释放回系统

我在Linux(64位)上使用最新的Sun Java 6的Eclipse 3.6,其中包含大量大型项目。 在一些特殊情况下(例如SVN更新),Eclipse需要高达1 GB的。 但大部分时间只需要350 MB。 当我启用堆状态面板时,我大部分时间都看到:

350万878M

我用这些设置启动Eclipse:-Xms128m -Xmx1024m

所以大部分的时间都是白白浪费的,只是在短时间内存使用量达到峰值时才使用。 我不喜欢这一点,我希望Eclipse释放内存回到系统,所以我可以用它来做其他程序。

当Eclipse需要更多的内存,而没有足够的可用RAM时,Linux可以将其他正在运行的程序换掉,我可以忍受。 我听说有一个-XX:MaxHeapFreeRatio选项。 但我从来没有想出我有什么价值,所以它的工作原理。 没有任何价值,我尝试曾经有所作为。

那么我怎么能告诉Eclipse(或Java)释放未使用的堆?

Solutions Collecting From Web of "Eclipse将堆释放回系统"

找到了解决办法。 我将Java切换到使用G1垃圾收集器,现在HeapFreeRatio参数按预期工作。 所以我在eclipse.ini中使用这些选项:

-XX:+UnlockExperimentalVMOptions -XX:+UseG1GC -XX:MinHeapFreeRatio=5 -XX:MaxHeapFreeRatio=25 

现在,当Eclipse为一个复杂的操作吃掉1GB以上的内存,并在垃圾收集之后切换回300MB时,内存实际上被释放回操作系统。

您可以转到“ Preferences -> General然后选中“ Show heap status 。 这激活了Eclipse角落的一个很好的视图。 像这样的东西:

替代文字

如果您单击垃圾桶,它将尝试运行垃圾回收并返回内存。

Java的堆只不过是在JVM进程堆空间中管理的一个大数据结构。 即使它们占用相同的内存,这两个堆也是逻辑上分离的实体。

JVM受主机系统的malloc()实现的malloc()malloc()使用brk()从系统分配内存。 在Linux系统上(也是Solaris),分配给进程堆的内存几乎从不返回,主要是因为它变成了碎片,堆必须是连续的。 这意味着分配给进程的内存将单调增加,而保持规模的唯一方法不是首先分配它。

-Xms-Xmx告诉JVM如何提前调整Java堆的大小,这会导致它分配进程内存。 Java可以垃圾收集,直到太阳烧毁,但是这种清理是JVM的内部,支持它的进程内存不会返回。


从下面的评论详细说明:

用C编写的程序(特别是运行Eclipse的JVM)分配内存的标准方法是调用malloc(3) ,它使用OS提供的机制为进程分配内存,然后管理这些分配内的各个分配。 malloc()free()工作细节是特定于实现的。

在大多数Unix系统中,一个进程只能得到一个数据段,这个数据段是指向开始和结束指针的连续内存区域。 这个过程可以通过调用brk(2)来调整这个段的大小,增加结束指针来分配更多的内存,或者减少它返回给系统。 只有结束可以调整。 这意味着如果你的malloc()放大数据段, free()的相应实现不能缩小它,除非它确定末尾没有空格。 在实践中,当你free()它的时候,你用malloc()分配的大量内存很少会在数据段的最后结束,这就是为什么进程倾向于单调增长。