在我们的SLES12系统上运行这个简单的Java程序将保留4 4GB的虚拟内存:
class Test {
public static void main(String[] args) throws Exception {
Thread.sleep(100000);
}
}我能够使用这些标志将其减少到1 1GB:
java -Xmx1m -XX:ReservedCodeCacheSize=5m -XX:CompressedClassSpaceSize=5m -Xss228k -XX:LargePageSizeInBytes=1m -XX:MaxDirectMemorySize=1k Test尽管如此,在我们的SLES11系统(内存相同)上,这只需要200M。我已经用jconsole检查了所有的内存池,没有什么大的问题。两者都运行OpenJDK 8.0.202。你知道如何避免这种内存预留吗?
发布于 2019-06-13 15:30:18
我使用的是windows10和java 1.8.0_201。我用你的参数和-XX:NativeMemoryTracking=summary参数运行这个应用程序,我得到的结果如下:
本机内存跟踪:
总计: reserved=49889KB,committed=38613KB
预留内存表示我们的应用程序可以潜在使用的内存总量。相反,提交的内存等于我们的应用程序现在正在使用的内存量。Java8使用并行gc作为默认GC。所以我为change default GC算法添加了-XX:+UseSerialGC参数,我得到了如下结果:
本机内存跟踪:
总计: reserved=29565KB,committed=18349KB
因为类、线程、内部和gc提交的区域减少了。你可以在oracle docs.中找到必要的信息,编译器有线程,而这些线程占据了这个区域。我使用了-XX:CICompilerCount=1和-XX:-TieredCompilation来减少编译器线程的数量。结果是:
本机内存跟踪:
总计: reserved=27481KB,committed=16265KB
** *我不建议您执行以下操作。这不是quarentee,可能会意外崩溃。我只是在试着回答问题。* **
我使用"-XX:VMThreadStackSize=256“参数减少了VM线程的堆栈大小。结果是
总数: reserved=25177KB,committed=13961KB
结果:通过这些参数,我们将发送区域从38613KB减少到13961KB,将保留区域从49889KB减少到25177KB。
备注:我专注于内存预留。我没有考虑应用程序的性能。
https://stackoverflow.com/questions/56568839
复制相似问题