我遇到了一个我编写的java应用程序的问题,导致了硬件性能问题。问题(我相当肯定)是,我运行应用程序的一些机器只有1GB的内存。当我启动我的Java应用程序时,我将堆大小设置为-Xms 512m -Xmx 1024m。
我的第一个问题是,我的假设是正确的,这显然会导致性能问题,因为我将所有机器内存分配给java堆?
这引出了另一个问题。我在应用程序上运行jconsole并监视应用程序内存使用情况。我所看到的是,该应用程序在启动时消耗大约30mb,大约150mb并且垃圾收集器运行并且它回落到30mb。我也看到在pid上使用top是应用程序从使用大约6%的内存开始然后慢慢爬升到大约20%。我不明白。当我为它分配1GB时,为什么它只能达到20%的内存使用量。不应该达到100%。此外,为什么它没有使用那么多内存(20%),因为它看起来应用程序使用的内存超过150mb?
我认为很明显我需要调整我的Xms和Xmx,这应该可以解决问题,但是我试图更好地理解究竟发生了什么。
答案 0 :(得分:1)
内存使用的两种可能性:
您的应用只是没有使用那么多内存
或者
你的应用程序没有足够快地使用那么多内存。
会发生什么:
垃圾收集器有几个点可以执行:
刚安排:它将清理易于删除的对象
完整收集:当您达到设定的内存限制时会运行。
如果选项1(通常低得多的影响快速收集)可以控制内存使用,除非将JVM GC选项设置为按计划运行完整,否则它不会达到完整集合。
使用您的应用程序,我将开始设置较低的xmx / xms值,以便为操作系统留出更多保证资源,并且可能会阻止某些分页。