我在docker内部使用了tomcat:8。
这是一些重要设置(默认)。

$ java -XX:+PrintFlagsFinal -version | grep -iE 'HeapSize|PermSize|ThreadStackSize'
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                          := 33554432                            {product}
    uintx LargePageHeapSizeThreshold                = 134217728                           {product}
    uintx MaxHeapSize                              := 524288000                           {product}
     intx ThreadStackSize                           = 1024                                {pd product}
     intx VMThreadStackSize                         = 1024                                {pd product}


现在,我需要增加最大堆大小,因为我遇到了outofmemory问题。 (应用程序非常繁重)。

在内存耗尽之前,它警告我接近最大堆大小,并且tomcat将变为outofmemory。几分钟后,它崩溃了。

在我的tomcat内部署了几个.war
这些应用程序位于/deployments/xxx.war中。

ls给我看

app1_0.1
app1_0.1.war
app2_0.1
app2_0.1.war
...


现在,我的问题如下。我是否必须分别增加每个.war文件或整个tomcat的堆大小。
因为我找不到在一个Java应用程序上检查堆大小的命令,但是当我想增加堆大小时,我似乎只找到这样的命令:java -Xms16m -Xmx64m ClassName(在一个特定的应用程序上也是如此)。

当我不指定应用程序就执行它时:

$ java -Xms16m -Xmx64m
Picked up JAVA_TOOL_OPTIONS: -Duser.home=/home/jboss -Duser.name=jboss
Usage: java [-options] class [args...]
           (to execute a class)
   or  java [-options] -jar jarfile [args...]
           (to execute a jar file)
where options include:
    -d32      use a 32-bit data model if available
    -d64      use a 64-bit data model if available
    -server   to select the "server" VM
                  The default VM is server,
                  because you are running on a server-class machine.
...

最佳答案

看看有关OutOfMemory错误解决方案的相关SE问题

java.lang.OutOfMemoryError: Java heap space

MaxPermSize标志已在JDK 1.8中删除。它由Metaspace代替。

JDK8:元空间

在JDK 8中,类元数据现在存储在本机堆中,此空间称为Metaspace。在JDK 8中为Metaspace添加了一些新标记:

-XX:MetaspaceSize=<NNN>其中,是为类元数据分配的初始空间量(初始高水位标记)(以字节为单位),这可能会导致垃圾回收来卸载类。

-XX:MaxMetaspaceSize=<NNN>其中是要为类元数据分配的最大空间量(以字节为单位)。

看看oracle blog

由于您使用的是64位操作系统,因此在VM参数中使用-d64选项。

您要设置的VM参数对于实例而言是全局的。

关于java - 为我的所有应用程序增加Tomcat中的堆大小,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40839772/

10-14 12:28