故障现象:
由内存溢出(OutOfMemoryError: PermGen space)
故障原因:
1. 本身比较庞大,系统初始加载的类超过9000个,JDK1.8(不含)之前的JDK通过分配永久保存区域(Permanent Generation space)加载class,系统默认设置约64M,不能满足系统加载的要求,系统运行一段时间后,永久保存区域占满就出现内存溢出。
2.PermGen space的全称是PermanentGeneration space,是指内存的永久保存区域,这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到PermGen space中,它和存放类实例(Instance)的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGenspace进行清理,所以如果你的应用中有很CLASS的话,就很可能出现PermGen space错误,这种错误常见在web服务器对JSP进行pre compile的时候。如果你的WEB APP下都用了大量的第三方jar, 其大小超过了jvm默认的大小那么就会产生此错误信息了。但目前的hibernate和spring项目中也很容易出现这样的问题。可能是由于这些框架会动态class,而且jvm的gc是不会清理PemGen space的,超过了jvm默认的大小,导致内存溢出。
解决方案:
首先:
将绿色的Tomcat 注册为服务
1. 进入到tomcat 的目录所在
a) 在cmd 下
Cd D:\ProgramFiles\apache-tomcat-7.0.40>cd bin (也可以一级一级进入目录)
b) 注册 service.bat install serviceName (服务名),发下是成功提示
c) 删除 服务 sc delete Tomcat7,以下是成功提示
d) Tomcat以Windows服务的方式启动的情况下,通过Tomcat7w.exe打开启动参数设置界面,在JAVA标签页下的启动参数部分设置PermSize、MaxPermSize,加大内存
在 CMD 下进入到Tomcat Bin目录执行以下命令
会弹出以下对话窗口
e) 在对话窗口的 “JAVA”选项卡下 / “Java Options” 下的完整内容如下:
/**** 原有内容Start ***/
-Dcatalina.base=D:\ProgramFiles\apache-tomcat-7.0.40
-Dcatalina.home=D:\ProgramFiles\apache-tomcat-7.0.40
-Djava.endorsed.dirs=D:\ProgramFiles\apache-tomcat-7.0.40\endorsed
-Djava.io.tmpdir=D:\ProgramFiles\apache-tomcat-7.0.40\temp
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
-Djava.util.logging.config.file=D:\ProgramFiles\apache-tomcat-7.0.40\conf\logging.properties
/****原有内容 End ***/
/****听设置内容 Start ***/
-Djava.rmi.server.hostname=0.0.0.0
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port="9090"
-Dcom.sun.management.jmxremote.authenticate="false"
-Dcom.sun.management.jmxremote.ssl="false"
/****听设置内容 End ***/
/****服务启动设置内在内容 Start ****/
-XX:PermSize=256M
-XX:MaxPermSize=256M
/****服务启动设置内在内容 Start ****/
说明:注释只起到说明作用,添加时不要添加注释部分内容
1. 以startup.bat方式命令
行方式启动的情况下,在Tomcat/bin/catalina.bat内设置保区内存大小
在“echo"Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行
JAVA_OPTS="-server-XX:PermSize=128M -XX:MaxPermSize=128m
2. JDK1.8以上版本说明
使用JDK1.8以上版本,可规避此问题,jdk1.8之后使用元空间Metaspace代替了PermGen space,默认情况下,类元数据分配受到可用的本机内存容量的限制,因此不会出现保存区内存溢出的问题了,系统无需做其它设置。
辅助工具:
Visualvm可监控JVM运行期间的内存占用情况,可观察Tomcat进程内存占用和保存区占用/元数据空间的内容占用曲线,可以有效分析系统运行状态,可确认设置是否生效
下载地址:https://visualvm.java.net/
tomcat日志查看 系统内存溢出
解决步骤:
1、停止tomcat服务
2、cmd 打开命令窗口,进到tomcat的bin目录下
3、输入命令tomcat7w.exe//ES//sbba (注:sbba是注册到服务中的tomcat服务名)打开tomcat的Properties(属性)如图附件20图一,点击java查看tomcat的端口
4、查看Java Options-Dcom.sun.management.jmxremote.port="9090"
5、打开visualvm_138文件目录bin下创建的快捷方式开始监控tomcat项目耗费资源的曲线图(VisualVM可生成和分析海量数据、跟踪内存泄漏、监控垃圾回收器、执行内存和CPU分析,同时它还支持在MBeans上进行浏览和操作),从第4步得知tomcat项目所占用的端口是9090 ,所以新建JMX端口为9090 如图附件下图
打开创建的监听,就可以看到TOMCAT 相关的端口了
重启服务器,等待tomcat项目自启动后,可正常访问系统了