首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SUSe 12与SuSe 11上的高虚拟内存

SUSe 12与SuSe 11上的高虚拟内存
EN

Stack Overflow用户
提问于 2019-06-13 03:04:33
回答 1查看 168关注 0票数 1

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

代码语言:javascript
复制
class Test {  
  public static void main(String[] args) throws Exception {
    Thread.sleep(100000);    
  }
}

我能够使用这些标志将其减少到1 1GB:

代码语言:javascript
复制
java -Xmx1m -XX:ReservedCodeCacheSize=5m -XX:CompressedClassSpaceSize=5m -Xss228k -XX:LargePageSizeInBytes=1m -XX:MaxDirectMemorySize=1k Test

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

EN

回答 1

Stack Overflow用户

发布于 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。

备注:我专注于内存预留。我没有考虑应用程序的性能。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56568839

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档