SUSe 12与SUSe 11上的JVM高虚拟内存

SUSe 12与SUSe 11上的JVM高虚拟内存,jvm,Jvm,在我们的SLES12系统上运行此简单Java程序可保留4GB的虚拟内存: class Test { public static void main(String[] args) throws Exception { Thread.sleep(100000); } } 我能够使用以下标志将其减少到1GB: java -Xmx1m -XX:ReservedCodeCacheSize=5m -XX:CompressedClassSpaceSize=5m -Xss228k

在我们的SLES12系统上运行此简单Java程序可保留4GB的虚拟内存:

class Test {  
  public static void main(String[] args) throws Exception {
    Thread.sleep(100000);    
  }
}
我能够使用以下标志将其减少到1GB:

java -Xmx1m -XX:ReservedCodeCacheSize=5m -XX:CompressedClassSpaceSize=5m -Xss228k -XX:LargePageSizeInBytes=1m -XX:MaxDirectMemorySize=1k Test

然而,在我们的SLES11系统上(具有相同的内存量),这只需要200米。我已经用jconsole检查了所有的内存池,没有什么大问题。两者都使用OpenJDK 8.0.202运行。知道如何避免这种内存保留吗?

我使用了windows 10和java 1.8.0\u 201。我使用您的参数和参数运行此应用程序,结果如下:

本机内存跟踪:

总计:保留=49889KB,已提交=38613KB

保留内存表示我们的应用程序可能使用的内存总量。相反,提交的内存等于我们的应用程序当前使用的内存量。 Java8使用并行GC作为默认GC。因此,我添加了-XX:+UseSerialGC参数来更改默认GC算法,结果如下:

本机内存跟踪:

总计:保留=29565KB,已提交=18349KB

因为类、线程、内部和gc提交区域减少了。您可以在中找到必要的信息 JIT编译器有线程,这些线程占据了这个区域。我使用-XX:CICompilerCount=1-XX:-tieredcomilation来减少编译器线程的数量。结果是:

本机内存跟踪:

总计:保留=27481KB,已提交=16265KB

***我不建议您执行以下操作。这不是Quarente,可能会意外崩溃。我只是想回答这个问题***

我使用“-XX:VMThreadStackSize=256”参数调整VM线程的堆栈大小。结果是

总计:保留=25177KB,已提交=13961KB

结果:使用这些参数,我们将Comit区域从38613KB减少到13961KB,保留区域从49889KB减少到25177KB


注意:我专注于记忆保留。我没有考虑应用程序的性能。

1。尝试2.不用麻烦了,64位系统上的虚拟内存是“无限的”。谢谢!我已经使用了这些标志:/usr/intel/pkgs/openjdk/8.0.202/bin/java-Xmx1m-XX:ReservedCodeCacheSize=5m-XX:CompressedClassSpaceSize=5m-xs228k-XX:LargePageSizeInBytes=1m-XX:MaxDirectMemorySize=1k-XX:+UseSerialGC-XX:CICompilerCount=2-XX:VMThreadStackSize=256-XX:NativeMemoryTracking=summary测试并设法将虚拟机降到638M-仍然试图进一步减少它。。。问题是,本机内存跟踪显示的更少:Total:reserved=25067KB,committed=13955KB,因此看起来它并不能解释整个已使用的VMI内存。我认为您不应该尝试进一步减少已使用的内存。Jvm可能会意外崩溃。jvm现在已经在运行最低级别了。一般来说,这是有道理的,但这是一个小型客户端应用程序,所以我不太担心崩溃,更多的是100-200个不同的用户在同一台机器上运行客户端,耗尽了机器上的VM保留