天天看点

内存溢出问题解决方案与Visualvm监听添加

故障现象:

由内存溢出(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  (服务名),发下是成功提示

内存溢出问题解决方案与Visualvm监听添加

c)        删除 服务 sc delete Tomcat7,以下是成功提示

内存溢出问题解决方案与Visualvm监听添加

d)       Tomcat以Windows服务的方式启动的情况下,通过Tomcat7w.exe打开启动参数设置界面,在JAVA标签页下的启动参数部分设置PermSize、MaxPermSize,加大内存

在 CMD 下进入到Tomcat Bin目录执行以下命令

内存溢出问题解决方案与Visualvm监听添加

会弹出以下对话窗口

内存溢出问题解决方案与Visualvm监听添加

 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</span><span style="color:#538135;">
/****原有内容 End  ***/
/****听设置内容 Start  ***/
	</span><span style="color:#333333;">-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"</span><span style="color:#538135;">
/****听设置内容 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 如图附件下图

内存溢出问题解决方案与Visualvm监听添加
内存溢出问题解决方案与Visualvm监听添加
内存溢出问题解决方案与Visualvm监听添加
内存溢出问题解决方案与Visualvm监听添加
内存溢出问题解决方案与Visualvm监听添加
内存溢出问题解决方案与Visualvm监听添加

打开创建的监听,就可以看到TOMCAT      相关的端口了

内存溢出问题解决方案与Visualvm监听添加
内存溢出问题解决方案与Visualvm监听添加

重启服务器,等待tomcat项目自启动后,可正常访问系统了

继续阅读