Tomcat 服务器的 JVM 可用内存未返回给操作系统

问题描述 投票:0回答:2

我的tomcat服务器表现得很奇怪,它已经从系统分配了6GB内存,但超过4GB的内存被标记为“空闲”。

这是 tomcat 服务器状态的屏幕:

我理解 JVM 中的“可用内存”是什么意思,但我不明白为什么它没有返回,比如说在这种情况下至少 3GB 返回到系统。

环境:

  • Java 8
  • 雄猫 8
  • Debian 8.3
  • 机器总内存:64 GB
tomcat memory jvm debian
2个回答
4
投票

由于您没有覆盖任何 JVM 选项,Tomcat 使用默认的垃圾收集器,即 JDK 8 中的 ParallelGC。

ParallelGC 不会取消提交堆内存。尝试

-XX:+UseG1GC
选项。 G1垃圾收集器 能够将内存释放回操作系统。

请参阅本文了解更多信息。


0
投票

当我通过运行 Tomcat9w.exe 添加“-XX:+UseG1GC”并在“Java”选项卡下添加该选项时,重新启动 Jakarta Tomcat Windows 服务时,它会抛出错误,并且直到我选择“-XX”后才会启动:+UseG1GC"退出选项。可能与我当前配置中设置的一些其他选项存在另一个冲突?他们在这里:

-Dcatalina.home=E:\MyApp\jakarta-tomcat
-Dcatalina.base=E:\MyApp\jakarta-tomcat
-Dignore.endorsed.dirs=E:\MyApp\jakarta-tomcat\endorsed
-Djava.io.tmpdir=E:\MyApp\jakarta-tomcat\temp
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
-Djava.util.logging.config.file=E:\MyApp\jakarta-tomcat\conf\logging.properties
-Dsun.security.ssl.allowUnsafeRenegotiation=true
-Djava.io.tmpdir=E:\MyApp\jakarta-tomcat\temp
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
-Djava.util.logging.config.file=E:\MyApp\jakarta-tomcat\conf\logging.properties
-Dcom.sun.management.jmxremote.port=8888
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
-Dfile.encoding=UTF-8
-Djava.awt.headless=true
-Dnet.sf.ehcache.enableShutdownHook=true
-Xrs
-XX:+CMSClassUnloadingEnabled
-XX:+UseConcMarkSweepGC
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=E:\MyApp\
-XX:CompileCommand=exclude,net/sf/jasperreports/engine/export/JRGridLayout,horizontallyMergeEmptyCells

此外,以下是该部分下方列出的 Java 9 选项:

--add-opens=java.base/java.lang=ALL-UNNAMED
--add-opens=java.base/java.io=ALL-UNNAMED
--add-opens=java.base/java.util=ALL-UNNAMED
--add-opens=java.base/java.util.concurrent=ALL-UNNAMED
--add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED

如有任何建议,我们将不胜感激。

© www.soinside.com 2019 - 2024. All rights reserved.