4年前 (2020-11-14)  jvm |   抢沙发  713 
文章评分 0 次,平均分 0.0

Tomcat-更改perm gen或metaspace大小

Perm gen是永久代的简称。Perm-gen用于Java版本7,metaspace用于Java版本8。Perm-gen/metaspace是为某些任务分配的内存,尤其是保存Java应用程序正在使用的类的声明。以下JVM参数用于配置JVM的最大perm gen/metaspace大小(本例中为256 MB)。如果更改perm gen/metaspace大小,则需要重新启动JVM才能使更改生效。

# Initial / Minimum Perm Gen Size
-XX:PermSize=256m

# Maximum Perm Gen Size
-XX:MaxPermSize=256m

# Maximum Metaspace Size
-XX:MaxMetaspaceSize=256m

是什么导致“内存不足”

如果JVM需要的perm gen/metaspace内存比分配的内存多,则内存不足事件将记录在catalina.log。当JVM中加载到metaspace中的应用程序类需要比最大metaspace内存值更多的内存时,JVM将耗尽perm gen/metaspace。例如,如果JVM配置了256mb的max perm gen/metaspace,并且需要256mb以上的内存来加载JVM中的应用程序中的类,那么JVM将耗尽元空间内存。

java.lang.OutOfMemoryError: PermGen space
java.lang.OutOfMemoryError: Metaspace

什么导致heap dump堆转储

堆转储将在JVM耗尽内存后发生。

Dumping heap to /path/to/java_pid12345.hprof ...

第一个应用程序部署

如果在首次将应用程序部署到JVM之后,JVM的perm gen/metaspace用完,这意味着需要增加JVM max perm gen/metaspace,以便能够将应用程序中的类加载到内存中。

应用程序重新部署(内存泄漏)

当应用程序重新部署到JVM时,将取消部署该应用程序的先前版本。如果要重新部署metagen/app所需的内存空间大于从metagen/app中重新部署的内存,则会导致从该对象中重新部署所需的空间。您应该能够确定这是否发生在jvm中catalina.log. 取消部署后,查找包含“这很可能会造成内存泄漏”的事件。

22-Oct-2018 09:37:50.170 WARNING [ContainerBackgroundProcessor[StandardEngine[Catalina]]] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [myApp] appears to have started a thread named [JMSCCThreadPoolMaster] but has failed to stop it. This is very likely to create a memory leak.

例如,假设一个应用程序正在使用大约200MB的perm gen/metaspace。

java metaspace 内存溢出

在应用程序的取消部署期间,如果没有删除一些线程,它们将继续使用perm gen/metaspace。

java metaspace 内存溢出

然后,当重新部署应用程序时,将使用所有perm gen/metaspace。

java metaspace 内存溢出

如果一次又一次地将应用程序部署到JVM中,则这一问题尤其严重,因此确定自JVM上次重新启动以来应用程序部署了多少次是一个好主意。因此,检查catalina.log日志以确定JVM最后一次重新启动的时间。

mm dd, yyyy hh:mm:ss org.apache.catalina.startup.Catalina start
INFO: Server startup in 23615 ms

检查catalina.log以确定自上次JVM重启以来应用程序部署了多少次。必须认识到,当JVM重新启动时,重新启动将包括应用程序的部署。

mm dd, yyyy hh:mm:ss org.apache.catalina.startup.HostConfig deployWAR
INFO: Deploying web application archive /path/to/example.war

什么时候可以增加最大perm gen/metaspace

如果JVM在JVM重启过程中耗尽了perm-gen或metaspace内存,那么增加max-perm-gen/metaspace是有意义的。

如果JVM在部署应用程序后耗尽了perm gen或metaspace内存,并且在catalina.log中没有“内存泄漏”事件,增加最大perm gen/metaspace是有意义的。

如果JVM在部署应用程序后耗尽了perm gen或metaspace内存,并且在catalina.log中出现了“内存泄漏”事件,增加最大perm/gen或metaspace可能没有意义。相反,您需要确定在catalina.log中为什么会出现“内存泄漏”事件。

java metaspace 内存溢出

其他排查方案可以参考这篇文章:https://javakk.com/790.html

 

除特别注明外,本站所有文章均为老K的Java博客原创,转载请注明出处来自https://javakk.com/824.html

关于

发表评论

表情 格式

暂无评论

登录

忘记密码 ?

切换登录

注册