jvm提示:ignoring option PermSize=512m; support was removed in 8.0

先说一下项目:项目是古老的spring项目,部署在tomcat下。
今天晚上,项目中的trans服务上线,从catalina.out观察服务重启log

信息: Stopping ProtocolHandler ["http-bio-8280"]
四月 1, 2021 8:36:09 下午 org.apache.coyote.AbstractProtocol stop
信息: Stopping ProtocolHandler ["ajp-bio-8209"]
四月 1, 2021 8:36:09 下午 org.apache.coyote.AbstractProtocol destroy
信息: Destroying ProtocolHandler ["http-bio-8280"]
四月 1, 2021 8:36:09 下午 org.apache.coyote.AbstractProtocol destroy
信息: Destroying ProtocolHandler ["ajp-bio-8209"]
/www/epaysch/tomcat-trans-8280/bin/catalina.sh: 行 419: 15147 已杀死               "/usr/local/java/jre/bin/java" "-Dnop" -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Xms1024m -Xmx2048m -Xss1024K -XX:PermSize=512m -XX:MaxPermSize=2048 -Dfile.encoding=UTF8 -Dsun.jnu.encoding=UTF8 -Djdk.tls.ephemeralDHKeySize=2048 -Djava.endorsed.dirs="" -classpath "/www/epaysch/tomcat-trans-8280/bin/bootstrap.jar:/www/epaysch/tomcat-trans-8280/bin/tomcat-juli.jar" -Dcatalina.base="/www/epaysch/tomcat-trans-8280" -Dcatalina.home="/www/epaysch/tomcat-trans-8280" -Djava.io.tmpdir="/www/epaysch/tomcat-trans-8280/temp" org.apache.catalina.startup.Bootstrap start
Java HotSpotTM) 64-Bit Server VM warning: ignoring option PermSize=512m; support was removed in 8.0
Java HotSpotTM) 64-Bit Server VM warning: ignoring option MaxPermSize=2048; support was removed in 8.0
四月 1, 2021 8:36:29 下午 org.apache.catalina.startup.VersionLoggerListener log 信息: Server version: Apache Tomcat/7.0.90
四月 1, 2021 8:36:29 下午 org.apache.catalina.startup.VersionLoggerListener log 信息: Server built: Jul 2 2018 17:05:37 UTC 四月 1, 2021 8:36:29 下午 org.apache.catalina.startup.VersionLoggerListener log 信息: Server number: 7.0.90.0
四月 1, 2021 8:36:29 下午 org.apache.catalina.startup.VersionLoggerListener log 信息: OS Name: Linux 四月 1, 2021 8:36:29 下午 org.apache.catalina.startup.VersionLoggerListener log 信息: OS Version: 3.10.0-862.el7.x86_64 四月 1, 2021 8:36:29 下午 org.apache.catalina.startup.VersionLoggerListener log 信息: Architecture: amd64 四月 1, 2021 8:36:29 下午 org.apache.catalina.startup.VersionLoggerListener log 信息: Java Home: /usr/local/java/jre 四月 1, 2021 8:36:29 下午 org.apache.catalina.startup.VersionLoggerListener log 信息: JVM Version: 1.8.0_191-b12 四月 1, 2021 8:36:29 下午 org.apache.catalina.startup.VersionLoggerListener log 信息: JVM Vendor: Oracle Corporation 四月 1, 2021 8:36:29 下午 org.apache.catalina.startup.VersionLoggerListener log 信息: CATALINA_BASE: /www/epaysch/tomcat-trans-8280
四月 1, 2021 8:36:29 下午 org.apache.catalina.startup.VersionLoggerListener log 信息: CATALINA_HOME: /www/epaysch/tomcat-trans-8280
四月 1, 2021 8:36:29 下午 org.apache.catalina.startup.VersionLoggerListener log 信息: Command line argument: -Dnop 四月 1, 2021 8:36:29 下午 org.apache.catalina.startup.VersionLoggerListener log 信息: Command line argument: -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager 四月 1, 2021 8:36:29 下午 org.apache.catalina.startup.VersionLoggerListener log 信息: Command line argument: -Xms1024m 四月 1, 2021 8:36:29 下午 org.apache.catalina.startup.VersionLoggerListener log 信息: Command line argument: -Xmx2048m 四月 1, 2021 8:36:29 下午 org.apache.catalina.startup.VersionLoggerListener log 信息: Command line argument: -Xss1024K 四月 1, 2021 8:36:29 下午 org.apache.catalina.startup.VersionLoggerListener log 信息: Command line argument: -XX:PermSize=512m 四月 1, 2021 8:36:29 下午 org.apache.catalina.startup.VersionLoggerListener log 信息: Command line argument: -XX:MaxPermSize=2048
四月 1, 2021 8:36:29 下午 org.apache.catalina.startup.VersionLoggerListener log 信息: Command line argument: -Dfile.encoding=UTF8 四月 1, 2021 8:36:29 下午 org.apache.catalina.startup.VersionLoggerListener log 信息: Command line argument: -Dsun.jnu.encoding=UTF8 四月 1, 2021 8:36:29 下午 org.apache.catalina.startup.VersionLoggerListener log 信息: Command line argument: -Djdk.tls.ephemeralDHKeySize=2048
四月 1, 2021 8:36:29 下午 org.apache.catalina.startup.VersionLoggerListener log 信息: Command line argument: -Djava.endorsed.dirs=
四月 1, 2021 8:36:29 下午 org.apache.catalina.startup.VersionLoggerListener log 信息: Command line argument: -Dcatalina.base=/www/epaysch/tomcat-trans-8280

发现有如下提示。这是HotSpot虚拟机的一个提示。这句话的意思是,PermSize 、 MaxPermSize 这些参数在jdk1.8已经移除了。

Java HotSpotTM) 64-Bit Server VM warning: ignoring option PermSize=512m; support was removed in 8.0
Java HotSpotTM) 64-Bit Server VM warning: ignoring option MaxPermSize=2048; support was removed in 8.0

再看近期发版的服务重启log,也有这个提示。

[viewlog@youfu-server tomcat-trans-8280]$ grep 'ignoring option PermSize' /www/epaysch/tomcat-trans-8280/logs/catalina.2021-03-2*.out 
/www/epaysch/tomcat-trans-8280/logs/catalina.2021-03-23.out:Java HotSpotTM) 64-Bit Server VM warning: ignoring option PermSize=512m; support was removed in 8.0

ps一下tomcat的进程,从中可以看到有-XX:PermSize=512m -XX:MaxPermSize=2048参数

(这里分享个小技巧:我们使用viewlog账号查看生产服务器的log,通常只有grep、ls这些命令,而没有权限执行ps这些命令。 如下这种执行方式就是小窍门)

[viewlog@youfu-server bin]$ cd /usr/bin/
[viewlog@youfu-server bin]$ ./ps -ef |grep 'tomcat-trans'
viewlog   3585  1391  0 12:09 pts/10   00:00:00 grep --color=auto tomcat-trans
yfpay    30832     1  0 Apr08 ?        00:00:00 /bin/sh /www/epaysch/tomcat-trans-8280/bin/catalina.sh start
yfpay    30833     1  0 Apr08 ?        00:02:07 /usr/local/sbin/cronolog /www/epaysch/tomcat-trans-8280/logs/catalina.%Y-%m-%d.out
yfpay    30834 30832  1 Apr08 ?        01:23:05 /usr/local/java/jre/bin/java -Dnop -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Xms1024m -Xmx2048m -Xss1024K -XX:PermSize=512m -XX:MaxPermSize=2048 -Dfile.encoding=UTF8 -Dsun.jnu.encoding=UTF8 -Djdk.tls.ephemeralDHKeySize=2048 -Djava.endorsed.dirs= -classpath /www/epaysch/tomcat-trans-8280/bin/bootstrap.jar:/www/epaysch/tomcat-trans-8280/bin/tomcat-juli.jar -Dcatalina.base=/www/epaysch/tomcat-trans-8280 -Dcatalina.home=/www/epaysch/tomcat-trans-8280 -Djava.io.tmpdir=/www/epaysch/tomcat-trans-8280/temp org.apache.catalina.startup.Bootstrap start

查看tomcat/bin/catalina.sh,有如下jvm配置参数

JAVA_OPTS="-Xms1024m -Xmx2048m -Xss1024K -XX:PermSize=512m -XX:MaxPermSize=2048 -Dfile.encoding=UTF8 -Dsun.jnu.encoding=UTF8"

查看java版本,服务器jdk版本是1.8,即8.0

[root@youfu-server ~]# java -version
java version "1.8.0_191"
JavaTM) SE Runtime Environment build 1.8.0_191-b12)
Java HotSpotTM) 64-Bit Server VM build 25.191-b12, mixed mode)

 查看java安装目录

[root@youfu-server ~]# whereis java
java: /usr/local/java /usr/local/java/bin/java
[root@youfu-server ~]# which java
/usr/local/java/bin/java

经查,java8已经摈弃了Perm的配置,不能再配置Perm永久代参数。而是引入了一个新的概念Metaspace。

在java虚拟机内部,class文件中包括类的版本、字段、方法、接口等描述信息,还有运行时常量池,用于存放编译器生成的各种字面量和符号引用。存放这些“永久”数据的区域叫做永久代(Permanent Generation,简称PermGen)。永久代是一片连续的堆空间。在JVM启动时通过命令行指定参数-XX:MaxPermSize来设定永久代最大可分配的内存空间。一个明显的问题是,PermGen的size很难调整,并且一旦这个值设置不当,当JVM加载的类信息容量超过了这个设定值后,应用将会报OOM错误(OutOfMemoryError)。
JAVA从JDK7的HotSpot虚拟机开始永久代的移除工作。

永久代在JDK8中被完全的移除了。所以永久代的参数-XX:PermSize和-XX:MaxPermSize也被移除了。
在JDK8中,类的元数据信息(class metadata)不再存储在连续的堆空间上,而是被存储在叫做Metaspace的本地内存(native memory)中。
由于类的元数据可以在本地内存native memory)之外分配,所以其最大可利用空间是整个系统内存的可用空间。这样,我们程序猿将不再会遇到OOM错误。

那么,解决办法就是修改java配置参数为:

JAVA_OPTS="-Xms1024m -Xmx2048m -Xss1024K -XX:MataspaceSize=512m -XX:MaxMetaspaceSize=2048 -Dfile.encoding=UTF8 -Dsun.jnu.encoding=UTF8"

参考Java PermGen 去哪里了? ,本文对JVM永久代以及JDK8 JVM里的Metaspace有全面的介绍。是一篇好文。

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注