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。
在应用程序的取消部署期间,如果没有删除一些线程,它们将继续使用perm gen/metaspace。
然后,当重新部署应用程序时,将使用所有perm gen/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中为什么会出现“内存泄漏”事件。
其他排查方案可以参考这篇文章:https://javakk.com/790.html
除特别注明外,本站所有文章均为老K的Java博客原创,转载请注明出处来自https://javakk.com/824.html
暂无评论