工作中常遇到的Tomcat内存溢出及解决方案
JVM的配置,最常用的两个配置就是:-Xms512m Xmx1024m-Xms设置JVM的初始化内存大小,-Xmx为最大内存大小,当突破这个值,将会报内存溢出,导致的原因有很多,主要是虚拟机的回收问题以及程序设计上的内存泄露问题;由于在超过-Xms时会产生页面申请的开销,所以一般很多应用服务器会推荐-Xms和-Xmx是等值的;最大值一般不保持在主机内存的75%的内存左右(多个SERVER是加起来的内存),当JVM绝大部分时间处于回收状态,并且内存长时间处于非常长少的状态就会报:java.lang.OutOfMemoryError:Java heap space的错误。上面提及到JVM很多的知识面,很显然你想去设置一下其它的参数,其实对于JVM设置的参数有上百个,这里就说一些较为常用配置即可。JVM内存配置分两大类:1、-X开头的参数信息:一般每个版本变化不大。2、-XX开头的参数信息:版本升级变化较大,如果没有太大必要保持默认即可。3、另外还有一个特殊的选项就是-server还是-client,他们在默认配置内存上有一些细微的区别,直接用JDK运行程序默认是-client,应用服务器生产模式一般只会用-server。这些命令其实就是在运行java命令或者javaw等相关命令后可以配置的参数,如果不配置,他们有相应的默认值配置。1、-X开头的常用配置信息:-Xnoclassgc 禁用垃圾回收,一般不适用这个参数-Xincgc 启用增量垃圾回收-Xmn1024K Eden区初始化JAVA堆的尺寸,默认值640K-Xms512m JAVA堆初始化尺寸,默认是32M-Xmx512m JAVA堆最大尺寸,默认64M,一般不超过2G,在64位机上,使用64位的JVM,需要操作系统进行unlimited方可设置到2G以上。2、-XX开头常用内存配置信息:-XX:-DisableExplicitGC 将会忽略手动调用GC的代码,如:System.gc(),将-DisableExplicitGC, 改成+DisableExplicitGC即为启用,默认为启用,什么也不写,默认是加号,但是系统内部默认的并不是什么都启用。-XX:+UseParallelGC 将会自动启用并行回收,多余多CPU主机有效,默认是不启用。-XX:+UseParNewGC 启用并行收集(不是回收),也是多CPU有效。-XX:NewSize=128m 新域的初始化尺寸。-XX:MaxNewSize=128m 新创建的对象都是在Eden中,其属于新域,在-client中默认为640K,而-server中默认是2M,为减少频繁的对新域进行回收,可以适当调大这个值。-XX:PerSize=64m 设置永久域的初始化大小,在WEBLOGIC中默认的尺寸应该是48M,一般够用,可以根据实际情况作相应条调整。-XX:MaxPerSize=64m 设置永久域的最大尺寸。另外还可以设置按照区域的比例进行设置操作,以及设置线程、缓存、页面大小等等操作。3、-XX开头的几个监控信息:-XX:+GITime 显示有多少时间花在编译代码代码上,这部分为运行时编译为对应机器码时间。-XX:+PrintGC 打印垃圾回收的基本信息-XX:+PrintGCTimeStamps 打印垃圾回收时间戳信息-XX:+PrintGCDetails 打印垃圾回收的详细信息-XX:+TraceClassLoading 跟踪类的加载-XX:+TraceClassResolution 跟踪常量池-XX:+TraceClassUnLoading 跟踪类卸载
?
?