Java的Tomcat 7容器上的heapsize和其他内存configuration

我使用的是一个红帽tomcat7容器(与Docker集线器上的tomcat7非常相似):

registry.access.redhat.com/jboss-webserver-3/webserver30-tomcat7-openshift:1.2-12 

我已经部署了一些.wars,但执行了很多过程后,我得到了以下错误:

 GC overhead limit exceeded java.lang.OutOfMemoryError: GC overhead limit exceeded 

所以我想调查最大的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产品或产品的含义是什么?
  • 最大heapsize = java或你的应用程序或整个tomcat的最大内存消耗量? 因为经过一番调查,我发现这个容器比1892 MB(19839 …)的内存要outofmemory

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

  • 你有一个内存泄漏 – 你正在保持对你正在使用的对象的引用,他们正在造成你的虚拟机无法释放内存与垃圾回收。 在这里解释好得多。 尝试通过查看jmap -histo <javaPID>的输出来确定发生这种情况的原因
  • 你的应用程序运行正常,你确实需要更多的堆内存。 你可以通过设置set CATALINA_OPTS= -Xmx2g来增加内存

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

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

这意味着该标志可用于“产品”(发布)构build,而不是那些用于开发,质量保证,诊断或实验的构build。 “pd”表示依赖于平台(Solaris vs Linux vs Windows等)。

最大heapsize = java或你的应用程序或整个tomcat的最大内存消耗量? 因为经过一番调查,我发现这个容器比1892 MB(19839 …)的内存要多得多。

正在运行的Java进程使用内存来处理堆以外的许多事情。 如果您在任何操作系统上安装了完整的JDK,您可以在Linux上使用/proc/$pid/maps或者使用jmap (默认格式)

  • JVM本身的代码,包括解释器和JIT编译器HotSpot,以及各种库,加上通过JNI或JNA访问的任何“本地”代码和“本地”数据。 一般而言,代码可能会与其他进程共享,但是我不确定这是否在docker容器中保持为真。

  • 'Metaspace'(在Java 8中,在早期版本中是'PermGen')和'CodeCache',它们包含加载的类和它们的JITted代码

  • 线程堆栈; Tomcat使用了相当多的线程,即使Java代码不行,JVM也有一些内置线程和本地线程

  • '直接'NIO缓冲区如果使用(我认为Tomcat至less有时)

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

另外,我不确定docker记忆测量是否包含stream程本身之外的任何内容。 你可能会比较topps -F