「jvm」Tomcat中JVM内存溢出及合理配置( 二 )


2. OutOfMemoryError: PermGen space 非堆溢出(永久保存区域溢出)
这种错误常见在web服务器对JSP进行pre compile的时候 。 如果你的WEB APP下都用了大量的第三方jar 其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了 。 如果web app用了大量的第三方jar或者应用有太多的class文件而恰好MaxPermSize设置较小 , 超出了也会导致这块内存的占用过多造成溢出 , 或者tomcat热部署时侯不会清理前面加载的环境 , 只会将context更改为新部署的 , 非堆存的内容就会越来越多 。
3. OutOfMemoryError: unable to create new native thread. 无法创建新的线程
这种现象比较少见 , 也比较奇怪 , 主要是和jvm与系统内存的比例有关 。 这种怪事是因为JVM已经被系统分配了大量的内存(比如1.5G) , 并且它至少要占用可用内存的一半 。
三、Java JVM内存配置
1. JVM内存分配设置的参数有四个
-Xmx Java Heap最大值 , 默认值为物理内存的1/4;
-Xms Java Heap初始值 , Server端JVM最好将-Xms和-Xmx设为相同值 , 开发测试机JVM可以保留默认值;
【「jvm」Tomcat中JVM内存溢出及合理配置】-Xmn Java Heap Young区大小 , 不熟悉最好保留默认值;
-Xss 每个线程的Stack大小 , 不熟悉最好保留默认值;
-XX:PermSize:设定内存的永久保存区域;
-XX:MaxPermSize:设定最大内存的永久保存区域;
-XX:PermSize:设定内存的永久保存区域;
-XX:NewSize:设置JVM堆的‘新生代’的默认大小;
-XX:MaxNewSize:设置JVM堆的‘新生代’的最大大小;
2. 如何设置JVM的内存分配
(1)当在命令提示符下启动并使用JVM时(只对当前运行的类Test生效):
java -Xmx128m -Xms64m -Xmn32m -Xss16m Test
(2)当在集成开发环境下(如eclipse)启动并使用JVM时:
a. 在eclipse根目录下打开eclipse.ini , 默认内容为(这里设置的是运行当前开发工具的JVM内存分配): -vmargs -Xms40m -Xmx256m -vmargs表示以下为虚拟机设置参数 , 可修改其中的参数值 , 也可添加-Xmn , -Xss , 另外 , eclipse.ini内还可以设置非 堆内存 , 如:-XX:PermSize=56m , -XX:MaxPermSize=128m 。
b. 打开eclipse-窗口-首选项-Java-已安装的JRE(对在当前开发环境中运行的java程序皆生效) 编辑当前使用的JRE , 在缺省VM参数中输入:-Xmx128m -Xms64m -Xmn32m –Xss16m 。
c. 打开eclipse-运行-运行-Java应用程序(只对所设置的java类生效) 选定需设置内存分配的类-自变量 , 在VM自变量中输入:-Xmx128m -Xms64m -Xmn32m -Xss16m 注:如果在同一开发环境中同时进行了b和c设置 , 则b设置生效 , c设置无效 , 如: 开发环境的设置为:-Xmx256m , 而类Test的设置为:-Xmx128m -Xms64m , 则运行Test时生效的设置为: -Xmx256m -Xms64m 。
(3)当在服务器环境下(如Tomcat)启动并使用JVM时(对当前服务器环境下所以Java程序生效):
a. 设置环境变量: 变量名:CATALINA_OPTS 变量值:-Xmx128m -Xms64m -Xmn32m -Xss16m 。
b. 打开Tomcat根目录下的bin文件夹 , 编辑catalina.bat , 将其中的%CATALINA_OPTS%(共有四处)替换为:-Xmx128m -Xms64m -Xmn32m -Xss16m 。
c. 若没有catalina.bat , 只有tomcat.exetomcat6w.exe;则可以在启动tomcat6w.exe 后 右键配置--Java--java option 下面输入:
-Xmx256m –Xms64m
也可以找到注册表HKEY_LOCAL_MACHINE\\SOFTWARE\\Apache Software Foundation\\TomcatService Manager\\Tomcat6\\Parameters\\JavaOptions原值为 -Dcatalina.home=\"C:\\ApacheGroup\\Tomcat 6.0\" -Djava.endorsed.dirs=\"C:\\ApacheGroup\\Tomcat 6.0\\common\\endorsed\" -Xrs 加入 -Xms300m -Xmx350m (我的是加入-Xmx350m , tomcat才能启动 , 加入-Xms300m -Xmx350m反而tomcat都不能启动)重起tomcat服务设置生效 。