Red Hat的Tomcat 7容器上java的Heapsize和其他内存配置

Red Hat的Tomcat 7容器上java的Heapsize和其他内存配置,java,tomcat,docker,heap-memory,Java,Tomcat,Docker,Heap Memory,我使用的是Red Hat tomcat7容器(与docker hub上的tomcat7非常类似): 我在其中部署了一些.wars,但在执行了很多过程后,我出现了以下错误: GC overhead limit exceeded java.lang.OutOfMemoryError: GC overhead limit exceeded 因此,我想研究max heapsize和其他内存设置: 命令: java -XX:+PrintFlagsFinal -version | grep -iE 'He

我使用的是Red Hat tomcat7容器(与docker hub上的tomcat7非常类似):

我在其中部署了一些.wars,但在执行了很多过程后,我出现了以下错误:

GC overhead limit exceeded
java.lang.OutOfMemoryError: GC overhead limit exceeded
因此,我想研究max heapsize和其他内存设置:

命令:

java -XX:+PrintFlagsFinal -version | grep -iE 'HeapSize|PermSize|ThreadStackSize'
Output:
Picked up JAVA_TOOL_OPTIONS: -Duser.home=/home/jboss -Duser.name=jboss          
     intx CompilerThreadStackSize                   = 0                         
          {pd product}                                                          
    uintx ErgoHeapSizeLimit                         = 0                         
          {product}                                                             
    uintx HeapSizePerGCThread                       = 87241520                  
          {product}                                                             
    uintx InitialHeapSize                          = 125829120                 
          {product}                                                             
    uintx LargePageHeapSizeThreshold                = 134217728                 
          {product}                                                             
    uintx MaxHeapSize                               = 1983905792             
          {product}                                                             
     intx ThreadStackSize                           = 1024                      
          {pd product}                                                          
     intx VMThreadStackSize                         = 1024                      
          {pd product}                                                          
openjdk version "1.8.0_91"                                                      
OpenJDK Runtime Environment (build 1.8.0_91-b14)                                
OpenJDK 64-Bit Server VM (build 25.91-b14, mixed mode) 
我不知道该如何解释这些信息。 我想增加治疗

  • pd产品或产品的含义是什么
  • max heapsize=java、应用程序或整个tomcat的最大内存消耗量吗?因为经过一些调查后,我发现该容器使用的内存比出现
    outofmemory
    问题时的1892MB(19839…)多得多

Tomcat应该为所有应用程序使用一个JVM。这确实使用了1892 MB(1983905792 B/10242),这里的问题可能是:

  • 内存泄漏-保留对正在使用的对象的引用,导致VM无法通过垃圾收集释放内存。解释得好多了。 通过查看
    jmap-histo
  • 你的应用程序运行正常,你确实需要更多的堆内存。您可以通过设置
    set CATALINA\u OPTS=-Xmx2g

尽管您的问题并没有真正解决您的问题,正如@Razvan所做的那样:

pd产品或产品的含义是什么?[在PrintFlagsFinal中]

这意味着该标志可用于“产品”(已发布)构建,而不是用于开发、QA、诊断或实验的构建“pd”是指平台相关(Solaris vs Linux vs Windows等)

max heapsize=java、应用程序或整个tomcat的最大内存消耗量吗?因为经过一些调查后,我发现这个容器使用的内存比发生outofmemory问题时的1892MB(19839…)多得多

运行的Java进程将内存用于堆以外的许多事情。您可以通过Linux上的
/proc/$pid/maps
jmap
(默认格式)看到这一点,如果您在任何操作系统上安装了完整的JDK:

  • JVM本身的代码,包括解释器和JIT编译器热点、各种库,以及通过JNI或JNA访问的任何“本机”代码和“本机”数据。一般来说,代码可以与其他进程共享,但我不确定在docker容器中是否仍然如此

  • “Metaspace”(在Java 8中,在早期版本中为“PermGen”)和“CodeCache”,其中包含加载的类和用于它们的JITted代码

  • 线程堆栈;Tomcat使用了相当多的线程,即使Java代码没有,JVM也有一些内置线程,可能还有本机线程

  • 使用“直接”NIO缓冲区(我认为Tomcat至少有时可以)

但只有堆中的对象被垃圾收集,所以其他区域与GC失败无关

此外,我不确定docker内存度量是否包括进程本身之外的任何内容。您可以将其与
top
ps-F
进行比较

java -XX:+PrintFlagsFinal -version | grep -iE 'HeapSize|PermSize|ThreadStackSize'
Output:
Picked up JAVA_TOOL_OPTIONS: -Duser.home=/home/jboss -Duser.name=jboss          
     intx CompilerThreadStackSize                   = 0                         
          {pd product}                                                          
    uintx ErgoHeapSizeLimit                         = 0                         
          {product}                                                             
    uintx HeapSizePerGCThread                       = 87241520                  
          {product}                                                             
    uintx InitialHeapSize                          = 125829120                 
          {product}                                                             
    uintx LargePageHeapSizeThreshold                = 134217728                 
          {product}                                                             
    uintx MaxHeapSize                               = 1983905792             
          {product}                                                             
     intx ThreadStackSize                           = 1024                      
          {pd product}                                                          
     intx VMThreadStackSize                         = 1024                      
          {pd product}                                                          
openjdk version "1.8.0_91"                                                      
OpenJDK Runtime Environment (build 1.8.0_91-b14)                                
OpenJDK 64-Bit Server VM (build 25.91-b14, mixed mode)