关于Java中内存溢出的解决办法
J2EE应用系统是运行在J2EE应用服务器上的,而j2ee应用服务器又是运行在JVM上的,生成环境中JVM参数的优化和设置对于J2EE应用系统性能有着决定性的作用。
AD:
J2EE应用系统是运行在J2EE应用服务器上的,而j2ee应用服务器又是运行在JVM上的,生成环境
中JVM参数的优化和设置对于J2EE应用系统性能有着决定性的作用。要优化系统,则需要对JVM参数进行合理的设置,所以我们需要了解究竟在什么地方进
行设置、有哪些参数以及各参数的意义分别是什么,并且我们还得了解JVM的内存管理机制究竟是个什么玩意儿?其实我们在网上搜索引擎上,一搜就有可以获取
到一大把相关信息,关键是我们如何深入的理解它们。那么下面我们就简单的介绍一下究竟什么是JVM的内存管理机制吧~!
JVM的早期版本并没有进行分区管理;这样的后果是JVM进行垃圾回收时,不得不扫描JVM所管理的整片内存,所以搜集垃圾是很耗费资源的事情,也是早起JAVA程序的性能低下的主要原因。随着JVM的发展,JVM引进了分区管理的机制。
JVM所管理的所有内存资源分为2个大的部分。永久存储区(Permanent Space) 和堆空间(The Heap Space)。其中对空间又分为新生区()和养老区,新生区又分为伊甸园,幸存者0区、幸存1区。如下图:
关于个分区的用途,大家可以参考其他相关文档。本教程所要处理的问题是如何解决内存溢出的问题。接下来以tomcat服务器为例:
我们首先得找到内存管理所要设置的参数在哪个文件:<CATALINA_HOME>/bin/catalina.bat。
需要添加一行代码:
JAVA_OPTS="-Xms512m-Xmx512m -Xss1024K -XX:PermSize=256m -XX:MaxPermSize=256m"
下面分别对各参数进行介绍和解释:
JVM 相关参数:
参数名参数说明
-server
启用能够执行优化的编译器, 显著提高服务器的性能,但使用能够执行优化的编译器时,服务器的预备时间将会较长。生产环境的服务器强烈推荐设置此参数。
-Xss
单个线程堆栈大小值;JDK5.0 以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。
-XX:
+UseParNewGC
可用来设置年轻代为并发收集【多CPU】,如果你的服务器有多个CPU,你可以开启此参数;开启此参数,多个CPU
可并发进行垃圾回收,可提高垃圾回收的速度。此参数和+UseParallelGC,-XX:ParallelGCThreads搭配使用。
+UseParallelGC
选择垃圾收集器为并行收集器。此配置仅对年轻代有效。即上述配置下,年轻代使用并发收集,而年老代仍旧使用串行收集。可提高系统的吞吐量。
-XX:
ParallelGCThreads 年轻代并行垃圾收集的前提下(对并发也有效果)的线程数,增加并行度,即:同时多少个线程一起进行垃圾回收。此值最好配置与处理器数目相等。永久存储区相关参数:参数名参数说明
-Xnoclassgc
每次永久存储区满了后一般GC 算法在做扩展分配内存前都会触发一次FULL GC,除非设置了-Xnoclassgc.
-XX:PermSize
应用服务器启动时,永久存储区的初始内存大
-XX:MaxPermSize
应用运行中,永久存储区的极限值。为了不消耗扩大JVM 永久存储区分配的开销,将此参数和-XX:PermSize这个两个值设为相等。堆空间相关参数参数名参数说明
-Xms
启动应用时,JVM 堆空间的初始大小值。
-Xmx
应用运行中,JVM 堆空间的极限值。为了不消耗扩大JVM 堆控件分配的开销,将此参数和-Xms 这个两个值设为相等,考虑到需要开线程,讲此值设置为总内存的80%.
-Xmn 此参数硬性规定堆空间的新生代空间大小,推荐设为堆空间大小的1/4。
上面所列的JVM 参数关系到系统的性能,而其中-XX:PermSize,
-XX:MaxPermSize,-Xms,-Xmx 和-Xmn 这5 个参数更是直接关系到系统的性能,系统是否会出现内存溢出。
-XX:PermSize 和-XX:MaxPermSize
分别设置应用服务器启动时,永久存储区的初始大小和极限大小;在生成环境中强烈推荐将这个两个值设置为相同的值,以避免分配永久存储区的开销,具体的值可
取系统“疲劳测试”获取到的永久存储区的极限值;如果不进行设置-XX:MaxPermSize
默认值为64M,一般来说系统的类定义文件大小都会超过这个默认值。
-Xms 和-Xmx 分别是服务器启动时,堆空间的初始大小和极限值。-Xms的默认值是物理内存的1/64 但小于1G,-Xmx
的默认值是物理内存的1/4 但小于1G.在生产环境中这些默认值是肯定不能满足我们的需要的。也就是你的服务器有8g 的内存,不对JVM
参数进行设置优化,应用服务器启动时还是按默认值来分配和约束JVM 对内存资源的使用,不会充分的利用所有的内存资源。
结论:“永久存储区溢出(java.lang.OutOfMemoryError:Java Permanent
Space)”乃是永久存储区设置太小,不能满足系统需要的大小,此时只需要调整-XX:PermSize 和-XX:MaxPermSize
这两个参数即可。“JVM 堆空间溢出(java.lang.OutOfMemoryError: Java heap space)”错误是JVM
堆空间不足,此时只需要调整-Xms 和-Xmx 这两个参数即可。
到此我们知道了,当系统出现内存溢出时,是哪些参数设置不合理需要调整。但我们怎么知道服务器启动时,到底JVM 内存相关参数的值是多少呢?
这个问题其实Sun公司早已经意料到了,所以给我们开发了内存使用监控工具jvmstat.
大家可以到ORACLE官网进行下载。用它可以很方便的看到我们的服务器内存使用情况。
将下载的jvmstat包解压到如“C:\ProgramFiles\Java\jvmstat”(这是我本地java路径,大家可以根据自己所安
装的java环境的路径进行解压)。启动完之后我们就可以使用visualgc命令了,cmd进入命令符窗口,输入tasklist(windows下查
看进程任务PID)查找到你要检测进程PID.然后直接输入visuglgc PID 就会弹出三个可见视图。
如下图:
原文链接:http://blog.csdn.net/czp0608/article/details/7352024
分享到:
相关推荐
Java内存溢出解决办法 加大Tomcat使用Jvm内存(转载) 注重版权 Caused by: java lang OutOfMemoryError: Java heap space 错误原因及解决方法
Java内存溢出解决办法,很普遍的问题,希望能有所帮助。
关于Java中内存溢出的解决办法 关于Java中内存溢出的解决办法
kettle内存溢出(Java heap space)以及解决方法
解决Java程序内存溢出的几种办法和处理问题的一些经验
关于JAVA中内存溢出的解决办法,增加参数配置即可
Java内存溢出的详细解决方案 Java内存溢出的详细解决方案
Java中OutOfMemoryError(内存溢出)的三种情况及解决办法
使用BitmapFactory加载图片时,如果图片过大可能引起OutOfmemory溢出的问题。解决办法。
解决java内存溢出解决方法,请认真读哦
poi读取大量数据会造成gc内存溢出的报错,由于垃圾回收机制无法将大量的对象及时的回收,而这些对象又会保存在内存中,会导致内存不够用的情况,这时候我们就需要使用新的方法,读取为cvs即可.此解决方案可支持千万数据的...
tomcat内存溢出解决办法,错误信息:java.lang.OutOfMemoryError:PermGen space 参考该文档可快速解决内存溢出的问题,服务器:tomcat
java 使用 poi 解析导入大数据量(几万数据量+)时,报出OOM。这是使用POI 第二种处理方法,解决大数据量导入内存溢出问题,并提升效率
我们上层应用平台是使用java开发的,但开放平台是使用c++开发,虽提供给我们对应的.h头文件,但在java中来解析这些数据就显然有些复杂,在实现、效率上都可能不太理想。 解决方案: 请C++同事帮忙写个dll程序,dll去...
Java内存溢出类型及java内存溢出解决办法
使用FishEye同步查看SVN代码,经常会遇到内存溢出的问题,该解决方法在64位操作系统上测试通过
Tomcat内存溢出的解决方法(java.util.concurrent.ExecutionException:java.lang.OutOfMemoryError),内附解决方案!
本篇文章主要分析了JAVA程序内存溢出问题原因,较为详细的说明了java导致程序内存溢出的原因与解决方法,感兴趣的小伙伴们可以参考一下。
下载的资源文件中,封装了并发计算以及内存溢出解决方案的工具类GroovyEngine.java,调用示例: GroovyEngine engine = GroovyEngine.getInstance(); engine.put("a",1); engine.put("b",2); Object v1 = engine....
NULL 博文链接:https://tlk20071.iteye.com/blog/1283378