在Java中调整垃圾收集参数

我有一个服务器java组件,它在启动时具有巨大的内存需求,逐渐逐渐消失。 因此,作为启动时的一个例子,内存要求可能会达到4g; 在最初的激增结束后,将降至2g。 我已经将组件配置为以5g的内存开始,组件启动良好; 使用过的内存激增至4g,然后接近2g。 此时堆消耗的内存仍然在4g左右徘徊,我希望将其降低(基本上将可用内存保持在几百mb而不是2g。我尝试使用MinFreeHeapRatio和MaxFreeHeapRatio将它们从默认值降低但这导致在初始峰值期间初始运行后没有触发垃圾收集,并且使用的内存保持在高于平常水平。任何指针都会有很大帮助。

首先,我问你为什么担心在服务器上释放2 GB的ram? 2GB的内存约为100美元或更少。 如果这是在桌面上,我想我可以理解这个担心。

如果您确实有充分的理由考虑它,这可能与您正在使用的垃圾收集算法有关。 有些算法会将未使用的内存释放回操作系统,有些则不会。 在http://www.stefankrause.net/wp/?p=14上有一些与此相关的图表。 您可能想尝试G1收集器,因为它似乎很容易将内存释放回操作系统。

从评论中编辑如果他们都选择立即加载他们的负载怎么办? 你还好吗,他们中的一些人将内存分页到磁盘并使服务器速度变慢? 我会在具有足够内存的服务器上运行它们以在最大堆运行所有应用程序,+另外4-6GB用于OS /缓存。 具有32或64 GB的服务器非常常见,您可以获得更多。

您必须记住,JVM在启动时保留虚拟内存,并且永远不会将其返回给操作系统(直到程序退出)您最希望的是未使用的内存被换出(这不是一个好的计划)如果您不喜欢不希望应用程序使用超过一定数量的内存,您必须将其限制为该数量。

如果你有许多使用内存峰值的组件,你应该考虑重新编写它们以在启动时使用更少的内存或在同一个JVM中使用多个组件,这样额外的内存就不那么重要了。