项目中tomcat设置java_opts:
JAVA_OPTS="$JAVA_OPTS -server -Xmx512m -Xms512m -Xss256K -XX:NewRatio=2 -XX:SurvivorRatio=6 -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled -XX:+CMSClassUnloadingEnabled -XX:LargePageSizeInBytes=32M -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 -XX:SoftRefLRUPolicyMSPerMB=0 -XX:+PrintClassHistogram -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+HeapDumpOnOutOfMemoryError -XX:-OmitStackTraceInFastThrow -XX:ErrorFile=/home/QbDev/h24log/appNew_err_%p.log -XX:HeapDumpPath=/home/QbDev/h24log/heapOOM.dump -XX:+PrintHeapAtGC -Xloggc:/home/QbDev/h24log/gc.log -DNEWS24H_CONF_PATH=$NEWS24H_CONF_PATH/app"
-Xmx512m:设置JVM最大可用内存为512M;
-Xms512m:设置JVM启动时堆的初始化大小。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。
-Xss256K:设置每个线程的堆栈大小。JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K。更具应用的线程所需内存大小进行调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。
-XX:NewRatio=2 :设置年轻代(包括Eden和两个Survivor区)与年老代的比值(除去持久代)。设置为2,则年轻代与年老代所占比值为1:2,年轻代占整个堆栈的1/3
-XX:SurvivorRatio=6 :设置年轻代中Eden区与Survivor区的大小比值。设置为6,则两个Survivor区与一个Eden区的比值为2:6,一个Survivor区占整个年轻代的1/8
-XX:+DisableExplicitGC:禁止代码中显示调用GC。如果加上了这个JVM启动参数,那么代码中调用System.gc()没有任何效果,相当于是没有这行代码一样。如果我们的应用中使用了java nio中的direct memory,那么使用-XX:+DisableExplicitGC一定要小心,存在潜在的内存泄露风险。
-XX:+UseConcMarkSweepGC:CMS收集器也被称为短暂停顿并发收集器。它是对年老代进行垃圾收集的。CMS收集器通过多线程并发进行垃圾回收,尽量减少垃圾收集造成的停顿。CMS收集器对年轻代进行垃圾回收使用的算法和Parallel收集器一样。这个垃圾收集器适用于不能忍受长时间停顿要求快速响应的应用。可使用
-XX:ParallelCMSThreads=n JVM选项来限制CMS收集器的线程数量。当CPU数量小于8个时,值等于CPU数量。当CPU数量大于8个时,值等于 3+((5*CPU个数)/8)
-XX:+UseParNewGC:表示要强制使用parNew收集器在新生代回收空间。 老年代使用串行回收器
-XX:+CMSParallelRemarkEnabled : 降低标记停顿
-XX:+CMSClassUnloadingEnabled:使用CMS回收perm区(class数据)
-XX:LargePageSizeInBytes=32M: 内存页的大小不可设置过大, 会影响Perm的大小
-XX:+UseFastAccessorMethods : 原始类型的快速优化
-XX:+UseCMSInitiatingOccupancyOnly : 使用手动定义初始化定义开始CMS收集
-XX:CMSInitiatingOccupancyFraction=70 : 使用cms作为垃圾回收使用70%后开始CMS收集(JDK1.5 时,CMSInitiatingOccupancyFraction
的默认值是 68
;JDK1.6 时,默认值调高为 92
。)为了保证不出现promotion failed(见下面介绍)错误,该值的设置需要满足以下公式CMSInitiatingOccupancyFraction计算公式
-XX:SoftRefLRUPolicyMSPerMB=0 : 每兆堆空闲空间中SoftReference的存活时间(默认值 1s)
-XX:+PrintClassHistogram : garbage collects before printing the histogram.
-XX:+PrintGC :输出GC日志
输出形式:
[GC 118250K->113543K(130112K), 0.0094143 secs]
[Full GC 121376K->10414K(130112K), 0.0650971 secs]
-XX:+PrintGCDetails :输出GC的详细日志
输出形式:[GC [DefNew: 8614K->781K(9088K), 0.0123035 secs] 118250K->113543K(130112K), 0.0124633 secs]
[GC [DefNew: 8614K->8614K(9088K), 0.0000665 secs][Tenured: 112761K->10414K(121024K), 0.0433488 secs] 121376K->10414K(130112K), 0.0436268 secs]
-XX:+PrintGCDateStamps :输出GC的时间戳(以基准时间的形式)
-XX:+HeapDumpOnOutOfMemoryError : 参数表示当JVM发生OOM时,自动生成DUMP文件。
-XX:-OmitStackTraceInFastThrow :强制要求JVM始终抛出含堆栈的异常
-XX:ErrorFile=/home/QbDev/h24log/appNew_err_%p.log :生成error 文件的路径, 默认是在java运行的当前目录
-XX:HeapDumpPath=/home/QbDev/h24log/heapOOM.dump:发生了 内存溢出错误 dump路径
-XX:+PrintHeapAtGC -Xloggc:/home/QbDev/h24log/gc.log : 打印GC前后的详细堆栈信息,日志文件的输出路径
-XX:PermSize=64M /-XX:MaxPermSize=64M : 方法区,永久区大小设置。JVM初始分配的非对内存64M。永久区保存系统的类信息。比如类的字段、方法、常量池等如果系统定义了太多的累,导致方法区溢出,虚拟机同样会抛出内存溢出错误
JDK8+移除了Perm,引入了Metapsace元数据区,元数据库区的大小可以使用-XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=512m 指定。这是一块堆外的直接内存。与永久区不同,如果不指定大小,默认情况下,虚拟机会耗尽所有的可用系统内存
-DNEWS24H_CONF_PATH=$NEWS24H_CONF_PATH/app : 设置启动参数