我在我的应用程序中看到非常大的堆大小,但使用的内存非常小:
堆大小:10 GB+,已用内存:500 MB
我的java内存参数如下:
-Xms8448m -Xmx12544m -XX:PermSize=192m -XX:MaxPermSize=256m -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=60
请指教,为什么会出现这种奇怪的行为。我可以在图中看到已用内存被垃圾收集,但是堆内存有什么问题????
我在我的应用程序中看到非常大的堆大小,但使用的内存非常小:
堆大小:10 GB+,已用内存:500 MB
我的java内存参数如下:
-Xms8448m -Xmx12544m -XX:PermSize=192m -XX:MaxPermSize=256m -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=60
请指教,为什么会出现这种奇怪的行为。我可以在图中看到已用内存被垃圾收集,但是堆内存有什么问题????
参数中的初始堆大小
-Xms8448m
超过8GB。此外,该
-Xmx12544m
允许 JVM 让它增长到超过 12GB,如果内存可用并且感觉这是最好的堆大小,它可能会这样做并且永远不会释放它。规范中根本没有说 JVM 应该尽量保持堆大小很小。
HotSpot JVM 中的堆大小永远不会下降。尽管一些 GC 算法可以将内存还给操作系统。但是在以后的情况下,JConsole 不会显示内存减少(在 JConsole 中,您会看到为堆保留的地址空间范围),您应该使用 OS 进程内存监控来查看 JVM 实际释放内存。
可以将未使用的内存还给操作系统的算法是
删除上面的 -Xms8448m 。它指定初始堆大小。如果您删除它,它应该可以按预期工作。
您将初始堆大小指定为 ~8.5GB,使用-Xms8448m
. java 的一些实现不支持实际缩小堆(通常由于系统限制)。减小该值以获得更小的初始堆。
JVM 将启动时的最大堆大小保留为虚拟内存。该内存中有多少是主内存取决于使用了多少。
当您设置最小内存时,它并不能保证它会被使用,但它只会进行最少的尝试来限制内存使用量。
但是为什么堆大小几乎是 12 GB?
这就是你设置的。