繁体   English   中英

Eclipse将堆释放回系统

[英]Eclipse release heap back to system

我正在使用Eclipse 3.6和Linux(64位)上的最新Sun Java 6以及大量项目。 在某些特殊情况下(例如SVN更新),Eclipse需要最多1 GB的堆。 但大多数时候它只需要350 MB。 当我启用堆状态面板时,我大部分时间都会看到这个:

350M的878M

我使用以下设置启动Eclipse:-Xms128m -Xmx1024m

因此,大多数时候MB的大量浪费只是在内存使用达到峰值时很少使用。 我根本不喜欢它,我希望Eclipse将内存释放回系统,所以我可以将它用于其他程序。

当Eclipse需要更多内存而没有足够的可用RAM而Linux可以换掉其他正在运行的程序时,我可以忍受。 我听说有一个-XX:MaxHeapFreeRatio选项。 但我从来没有弄清楚我必须使用什么价值,所以它有效。 没有任何价值我试过有所作为。

那么我如何告诉Eclipse(或Java)发布未使用的堆?

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

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

现在,当Eclipse为一项复杂的操作耗尽超过1 GB的RAM并在垃圾收集后切换回300 MB时,内存实际上会释放回操作系统。

您可以转到“ Preferences -> General并选中“ Show heap status 这会在Eclipse的角落激活堆的漂亮视图。 像这样的东西:

替代文字

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

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

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

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


以下评论的详细说明:

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

在Unix的大多数版本中,进程只获得一个数据段,这是一个连续的内存区域,其中包含指向开始和结束的指针。 该过程可以通过调用brk(2)并增加结束指针以分配更多内存或减少它以将其返回到系统来调整此段的大小。 只有结束才能调整。 这意味着如果你的malloc()扩大了数据段, free()的相应实现就不能缩小它,除非它确定最后没有使用的空间。 在实践中,当你free()它时,你用malloc()分配的大量内存很少会在数据段的最后结束,这就是为什么进程往往单调增长的原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM