Java:用于释放未使用内存的命令行参数

时间:2012-07-11 18:41:46

标签: java bash garbage-collection

在Bash中,我使用commmand java -Xmx8192m -Xms512m -jar jarfile启动Java进程,初始堆空间为512MB,最大堆空间为8GB。

我喜欢堆空间如何根据需求增加,但是一旦堆空间增加,它就不会释放,尽管进程不需要内存。如何释放进程未使用的内存?

示例:进程启动,并使用600MB内存。堆空间从512MB增加到略多于600MB。然后进程降低到400MB RAM使用率,但堆分配保持在600MB。如何使分配保持在RAM使用率附近?

3 个答案:

答案 0 :(得分:6)

你不能;它根本不是为那种方式而设计的。请注意,未使用的内存页面将由您的硬件简单地映射,因此不会消耗任何实际内存。

答案 1 :(得分:4)

一般情况下,你不希望JVM将内存返回给操作系统,后来声称这两种操作都不那么便宜。

有一些XX个参数可能会或可能不会与您首选的垃圾收集器一起使用,即

  • -XX:MaxHeapFreeRatio=70 GC之后的最大堆空闲百分比,以避免收缩。
  • -XX:MinHeapFreeRatio=40 GC之后的最小堆空闲百分比,以避免扩展。

Source

我相信你需要阻止世界收藏家对他们进行强制执行。 其他JVM可能有自己的参数。

我通常没有回复,但负面/虚假信息的数量并不酷。

答案 2 :(得分:1)

不,这是必需的功能。我认为,Android中的JVM可能会这样做,但我不确定。

但是其中大多数 - 包括所有Java EE VM - 对此都不感兴趣。

这看起来并不那么简单 - 虚拟机是一个来自操作系统视图的进程,它有一个映射的内存区域,它是一个堆栈或数据段。

在大多数情况下,它需要是一个连续的间隔。系统调用会在OS视图中进行内存分配和释放,系统调用该过程会向操作系统询问其新的段限制。

怎么做,如果你的JVM只有2千兆字节的RAM,它只使用500兆,但是这个500兆在这2个演出中分散在一些10字节的片段中?此内存释放功能还需要一个碎片整理步骤,这将增加GC运行的资源成本。

当Java运行时,Java对象由垃圾收集器构造和销毁,空闲和分配的内存区域分散在堆栈/数据段中。

当我们没有看到java,但是本机操作系统进程时,情况是一样的:如果你的malloc()十个1meg块,然后释放前9个,就没有办法把它还给OS,更新的图书馆和os apis对此有广泛的发展。当然,如果你以后再次分配内存,这个分配将从刚刚释放的区域完成。

我的意见是,即使这有点昂贵和复杂(以及一个相当大的编程工作),它值得付出代价,我认为它不是我们集体编程文化中最好的形象,它几十年来一直没有完成,包括java vms。