1

我在我的应用程序中看到非常大的堆大小,但使用的内存非常小:

堆大小:10 GB+,已用内存:500 MB

这是什么解释?为什么堆大小没有减少。 内存图

我的java内存参数如下:

-Xms8448m -Xmx12544m -XX:PermSize=192m -XX:MaxPermSize=256m -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=60

请指教,为什么会出现这种奇怪的行为。我可以在图中看到已用内存被垃圾收集,但是堆内存有什么问题????

4

5 回答 5

5

参数中的初始堆大小

-Xms8448m

超过8GB。此外,该

-Xmx12544m

允许 JVM 让它增长到超过 12GB,如果内存可用并且感觉这是最好的堆大小,它可能会这样做并且永远不会释放它。规范中根本没有说 JVM 应该尽量保持堆大小很小。

于 2012-09-21T13:40:12.460 回答
2

HotSpot JVM 中的堆大小永远不会下降。尽管一些 GC 算法可以将内存还给操作系统。但是在以后的情况下,JConsole 不会显示内存减少(在 JConsole 中,您会看到为堆保留的地址空间范围),您应该使用 OS 进程内存监控来查看 JVM 实际释放内存。

可以将未使用的内存还给操作系统的算法是

  • 串行收集器(-XX:+UseSerialGC)
  • G1 (-XX:+使用G1GC)
于 2012-09-22T10:40:04.723 回答
0

删除上面的 -Xms8448m 。它指定初始堆大小。如果您删除它,它应该可以按预期工作。

于 2012-09-21T13:41:16.107 回答
0

您将初始堆大小指定为 ~8.5GB,使用-Xms8448m. java 的一些实现不支持实际缩小堆(通常由于系统限制)。减小该值以获得更小的初始堆。

于 2012-09-21T13:41:42.867 回答
0

JVM 将启动时的最大堆大小保留为虚拟内存。该内存中有多少是主内存取决于使用了多少。

当您设置最小内存时,它并不能保证它会被使用,但它只会进行最少的尝试来限制内存使用量。

但是为什么堆大小几乎是 12 GB?

这就是你设置的。

于 2012-09-21T13:52:13.063 回答