Java内存溢出及jvm内存设置
2015-11-10 16:42
369 查看
内存溢出类型
(1)java.lang.OutOfMemoryError: PermGen space
JVM管理两种类型的内存,堆和非堆。堆是给开发人员用的上面说的就是,是在JVM启动时创建;非堆是留给JVM自己用的,用来存放类的信息的。它和堆不同,运行期内GC不会释放空间。如果web app用了大量的第三方jar或者应用有太多的class文件而恰好MaxPermSize设置较小,超出了也会导致这块内存的占用过多造成溢出,或者tomcat热部署时侯不会清理前面加载的环境,只会将context更改为新部署的,非堆存的内容就会越来越多。
PermGen space的全称是Permanent Generation space,是指内存的永久保存区域,这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到PermGen space中,它和存放类实例(Instance)的Heap区域不同,GC(Garbage
Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的应用中有很CLASS的话,就很可能出现PermGen space错误,这种错误常见在web服务器对JSP进行pre compile的时候。如果你的WEB APP下都用了大量的第三方jar, 其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了。
(2)java.lang.OutOfMemoryError: Javaheap space
第一种情况是个补充,主要存在问题就是出现在这个情况中。其默认空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。如果内存剩余不到40%,JVM就会增大堆到Xmx设置的值,内存剩余超过70%,JVM就会减小堆到Xms设置的值。所以服务器的Xmx和Xms设置一般应该设置相同避免每次GC后都要调整虚拟机堆的大小。假设物理内存无限大,那么JVM内存的最大值跟操作系统有关,一般32位机是1.5g到3g之间,而64位的就不会有限制了。
注意:如果Xms超过了Xmx值,或者堆最大值和非堆最大值的总和超过了物理内存或者操作系统的最大限制都会引起服务器启动不起来。
jvm设置虚拟内存
(1)JVM初始分配的内存由-Xms指定,默认是物理内存的1/64;JVM最大分配的内存由-Xmx指定,默认是物理内存的1/4。
(2)默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制。因此服务器一般设置-Xms、-Xmx相等以避免在每次GC
后调整堆的大小
(3)设置NewSize、MaxNewSize相等,且为Xmx的1/4"new"的大小最好不要大于"old"的一半,原因是old区如果不够大会频繁的触发"主"
GC ,大大降低了性能
(4)-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64;
(5)-XX:MaxPermSize设置最大非堆内存的大小,默认是物理内存的1/4。
以上可在tomcat/bin目录下的catalina.sh中添加配置项如下:
JAVA_OPTS='
-server -Xms8096m -Xmx8096m -XX:PermSize=2048m -XX:MaxPermSize=8096m -XX:NewSize=1024m -XX:MaxNewSize=1024m'
(1)java.lang.OutOfMemoryError: PermGen space
JVM管理两种类型的内存,堆和非堆。堆是给开发人员用的上面说的就是,是在JVM启动时创建;非堆是留给JVM自己用的,用来存放类的信息的。它和堆不同,运行期内GC不会释放空间。如果web app用了大量的第三方jar或者应用有太多的class文件而恰好MaxPermSize设置较小,超出了也会导致这块内存的占用过多造成溢出,或者tomcat热部署时侯不会清理前面加载的环境,只会将context更改为新部署的,非堆存的内容就会越来越多。
PermGen space的全称是Permanent Generation space,是指内存的永久保存区域,这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到PermGen space中,它和存放类实例(Instance)的Heap区域不同,GC(Garbage
Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的应用中有很CLASS的话,就很可能出现PermGen space错误,这种错误常见在web服务器对JSP进行pre compile的时候。如果你的WEB APP下都用了大量的第三方jar, 其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了。
(2)java.lang.OutOfMemoryError: Javaheap space
第一种情况是个补充,主要存在问题就是出现在这个情况中。其默认空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。如果内存剩余不到40%,JVM就会增大堆到Xmx设置的值,内存剩余超过70%,JVM就会减小堆到Xms设置的值。所以服务器的Xmx和Xms设置一般应该设置相同避免每次GC后都要调整虚拟机堆的大小。假设物理内存无限大,那么JVM内存的最大值跟操作系统有关,一般32位机是1.5g到3g之间,而64位的就不会有限制了。
注意:如果Xms超过了Xmx值,或者堆最大值和非堆最大值的总和超过了物理内存或者操作系统的最大限制都会引起服务器启动不起来。
jvm设置虚拟内存
(1)JVM初始分配的内存由-Xms指定,默认是物理内存的1/64;JVM最大分配的内存由-Xmx指定,默认是物理内存的1/4。
(2)默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制。因此服务器一般设置-Xms、-Xmx相等以避免在每次GC
后调整堆的大小
(3)设置NewSize、MaxNewSize相等,且为Xmx的1/4"new"的大小最好不要大于"old"的一半,原因是old区如果不够大会频繁的触发"主"
GC ,大大降低了性能
(4)-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64;
(5)-XX:MaxPermSize设置最大非堆内存的大小,默认是物理内存的1/4。
以上可在tomcat/bin目录下的catalina.sh中添加配置项如下:
JAVA_OPTS='
-server -Xms8096m -Xmx8096m -XX:PermSize=2048m -XX:MaxPermSize=8096m -XX:NewSize=1024m -XX:MaxNewSize=1024m'
相关文章推荐
- Java 6 JVM参数选项大全(中文版)
- Gson.toJson()时内存溢出StackOverflowError
- ASP在ACCESS中模糊查询"内存溢出"的解决方法
- Android 异步获取网络图片并处理导致内存溢出问题解决方法
- 基于Java内存溢出的解决方法详解
- Java虚拟机JVM性能优化(二):编译器
- Java程序员必须知道的5个JVM命令行标志
- tomcat6.0 /7.0安装版内存溢出设置方法
- 关于PHP内存溢出问题的解决方法
- Android加载图片内存溢出问题解决方法
- 浅谈C#互操作的内存溢出问题
- mongodb错误tcmalloc: large alloc out of memory, printing stack and exiting解决办法
- phpExcel导出大量数据出现内存溢出错误的解决方法
- Java虚拟机JVM性能优化(三):垃圾收集详解
- 解析Java虚拟机中类的初始化及加载器的父委托机制
- 一个JSP页面导致的tomcat内存溢出的解决方法
- JAVA中JVM的重排序详细介绍
- Java虚拟机JVM性能优化(一):JVM知识总结
- Android Studio 报错failed to create jvm error code -4的解决方法
- 解析Linux系统中JVM内存2GB上限的详解