先说一下项目:项目是古老的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 HotSpot(TM) 64-Bit Server VM warning: ignoring option PermSize=512m; support was removed in 8.0 Java HotSpot(TM) 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 HotSpot(TM) 64-Bit Server VM warning: ignoring option PermSize=512m; support was removed in 8.0
Java HotSpot(TM) 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 HotSpot(TM) 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" Java(TM) SE Runtime Environment (build 1.8.0_191-b12) Java HotSpot(TM) 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有全面的介绍。是一篇好文。