我在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 spaceMaxPermSize
标志已在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/