聊聊JVM常用参数设置
2016-07-30 10:46
281 查看
整体考虑堆大小
-Xms3550m, 初始化堆大小。通常情况和-Xmx大小设置一样,避免虚拟机频繁自动计算后调整堆大小。-Xmx3550m,最大堆大小。
考虑分代设置堆大小
首先通过jstat等工具查看应用程序正常情况下需要堆大小,再根据实际情况设置。新生代
-xmn2g,新生代大小。Sun官方推荐配置为整个堆的3/8。-XX:SurvivorRatio=8。Eden和Survivor的比值。
老年代
老年代=整个堆大小-新生代-永久代永久代
-XX:Permsize=512m,设置永久代初始值。-XX:MaxPermsize=512m,设置永久代的最大值。
注:Java8没有永久代说法,它们被称为元空间,-XX:MetaspaceSize=N
考虑本机直接内存
-XX:MaxDirectMemorySize=100M。默认与Java堆大最大值(-Xmx)考虑虚拟机栈
每个线程池的堆栈大小。在jdk5以上的版本,每个线程堆栈大小为1m,jdk5以前的版本是每个线程池大小为256k。一般设置256k。-Xss256K.
考虑选择垃圾收集器
Serial收集器(串行收集器)
历史最悠久的串行收集器。参数-XX:UseSerialGC。不太常用。ParNew和ParOld收集器(并发收集器)
Serial的多线程版本收集器。Parallel Scavenge(吞吐量优先垃圾收集器)
并行收集器,不同于多线程收集器ParNew,关注吞吐量的收集器。-XX:MaxGCPauseMillis=10,设置垃圾收集停顿的最大毫秒数。
-XX:GCTimeRatio=49,垃圾收集器占比,默认是99。
-XX:+UseAdaptiveSeizPolicy,GC自适应调节策略。
-XX:+UseParallelGC,虚拟机Server模式默认值,使用Parallel Scavenge + Serial Old进行内存回收。
-XX:+UseParallelOldGC, 使用Parallel Scavenge + Parallel Old 进行内存回收。
CMS
CMS作为老年代收集器,不能与Parallel Scavenge并存。可能会有内存碎片问题。-XX:+UserConcMarkSweepGC,新生代默认用ParNew收集。也可以用-XX:+UserParNewGC强制指定新生代用ParNew收集
-XX:ParallelGCThreads=4,设置垃圾收集线程数。默认是(CPU数量+3)/4。垃圾收集线程数不少于25%,当CPU数量小于4的时候影响大。
-XX:CMSInitiatingOccupancyFraction=80,老年代垃圾占比达到这个阈值开始CMS收集,1.6默认是92。设置过高容易导致并发收集失败,会出现SerialOld收集的情况。
-XX:+UseCMSCompactAtFullCollection,在FULL GC的时候, 对年老代的压缩增加这个参数是个好习惯。可能会影响性能,但是可以消除碎片。
-XX:CMSFullGCsBeforeCompaction=1,多少次后进行内存压缩。
-XX:+CMSParallelRemarkEnabled, 为了减少第二次暂停的时间,开启并行remark,降低标记停顿
G1(Garbage First)
-XX:+UseG1GC,谨慎使用,需要经过线上测试,还没有被设置为默认垃圾收集器。之前的垃圾收集器收集的范围是新生代或者老年代,而G1垃圾收集器收集的范围包括新生代和老年代整个堆。G1将Java堆划为多个大小相同的独立区域(Region),垃圾收集单位是Region。G1垃圾收集适合至少大于4G内存得系统。并且不会产生内存空间碎片。
其他参数
-XX:MaxTenuringThreshold=30,晋升老年代的年龄。-XX:PretenureSizeThreshold=?,晋升老年代的对象大小。没设置过。
考虑日志打印
-verbose:gc,打印GC日志-XX:+PrintGC,打印GC基本日志
-XX:+PrintGCDetails,打印GC详细日志
-XX:+PrintGCTimeStamps,打印相对时间戳
-XX:+PrintGCApplicationStoppedTime,打印垃圾回收期间程序暂停的时间
-XX:+PrintGCApplicationConcurrentTime,打印每次垃圾回收前,程序未中断的执行时间
-XX:+PrintTenuringDistribution:查看每次minor GC后新的存活周期的阈值
-XX:+PrintTLAB,查看TLAB空间的使用情况
-Xloggc:filename,把相关日志信息记录到文件以便分析
考虑OOM(堆溢出)时保留现场日志
当抛出OOM时进行heapdump
-XX:+HeapDumpOnOutOfMemoryError,JVM异常自动生成堆转储-XX:HeapDumpPath=,堆转储文件名
相关文章推荐
- Java 6 JVM参数选项大全(中文版)
- 深入解析JVM对dll文件和对类的装载过程
- JVM Tomcat性能实战(推荐)
- Java虚拟机JVM性能优化(二):编译器
- Java程序员必须知道的5个JVM命令行标志
- 学习JVM之java内存区域与异常
- Java虚拟机JVM性能优化(三):垃圾收集详解
- 简单谈谈JVM、JRE和JDK的区别与联系
- 解析Java虚拟机中类的初始化及加载器的父委托机制
- JAVA中JVM的重排序详细介绍
- 每天学Java!一分钟了解JRE与JDK
- 浅谈Java的虚拟机结构以及虚拟机内存的优化
- JVM角度调试优化MyEclipse
- Java虚拟机JVM性能优化(一):JVM知识总结
- Android Studio 报错failed to create jvm error code -4的解决方法
- 解析Linux系统中JVM内存2GB上限的详解
- 了解Java虚拟机JVM的基本结构及JVM的内存溢出方式
- Java堆空间占满的gc日志实例
- JVM调优之Tomcat启动参数配置及详解(一)
- java动态代理模式