我在 tomcat6.conf 中有以下参数
JAVA_OPTS="-server -Xmx6144m -Xms3072m -XX:+UseConcMarkSweepGC -XX:MaxGCPauseMillis=999 -XX:ReservedCodeCacheSize=128m -XX:MaxPermSize=256m -Djava.awt.headless=true -Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname= -Djava.rmi.server.useLocalHostname=false"
但在高峰期我经常会看到以下情况,
ERROR memory-watcher - used 87.73865761212004%, max 6403194880 reaping at priority CRITICAL
是否有任何参数可以用来调整 tomcat 性能或 GC?
答案1
“-Xms3072m”和“-Xmx6144m”位分别用于配置起始堆大小和最大堆。
这与“-XX:ReservedCodeCacheSize=128m”和“-XX:MaxPermSize=256m”位不同,在这些位中,您设置了生成内存(JVM 在其中存储类,而不是存储对象的堆)。我在这里注意到的一件事是大小不同。通常,出于一些与最小化垃圾收集有关的神秘原因,您希望它们相同。
您可能还想尝试“-XX:+UseParallelGC”而不是“-XX:+UseConcMarkSweepGC”...通常如果我对其中一个遇到问题,那么对另一个就会有更好的运气。
答案2
GC 是 JVM 的一个功能(并非特定于 tomcat),可以根据您所使用的特定 Java 风格/版本的文档进行调整。在我看来,大多数现代 Java 上的现代应用程序都不需要 GC 调整,前提是您没有执行诸如使 JVM 内存不足之类的操作(87% 已经达到这个水平)。在您提供的示例中,它可能就像增加 JVM 可用的内存量一样简单。6GB 在现代计算系统上并不是很大的内存量,您应该真正查看运行此系统的系统上有多少物理 RAM 可供使用。在大多数情况下,您可以安全地将一半或更多的 RAM 用于 JVM。考虑您的操作系统以及在机箱上运行的任何其他应用程序的推荐规格。满足这些要求后剩余的任何内存都可以并且可能应该提供给您的 JVM,以免您遇到内存瓶颈。如果您使用的 JVM 是专用服务器上的主要功能,则尤其如此。
-source:我曾是一家大型组织的系统管理员,该组织有许多运行在 Java 上的应用服务器,而且我是一名 Java 开发人员和用户。