Java-常用JVM参数

234 阅读5分钟
  • GC信息打印
-XX:+PrintGCDetails:打印GC日志,可以显示堆内存的信息;
  • 设置大对象直接进入老年代
-XX:PretenureSizeThreshold:通过这个参数可以设置多大的对象直接进入老年代而不进入年轻代;这个参数单位是“字节”;注意:这个参数只在Serial和ParNew两个收集器下有效;

-XX:MaxTenuringThreshold:设置需要经过多少次MinorGC后没有回收的对象突入老年代;

  • 开启Serial
-XX:+UseSerialGC -XX:+UseSerialOldGC

串行收集器,是最基础的版本,是单线程的;在进行垃圾收集工作的时候必须暂停其他所有的工作线程,直到收集结束;

  • 开启ParNew
-XX:+UseParNewGC -XX:ParallelGCThreads

是Serial的多线程版,默认的收集线程与CPU核数相同;可以使用-XX:ParallelGCThreads指定收集线程数;

  • 开启老年代担保机制
-XX:-HandlePromotionFailure
  • 开启偏向锁
-XX:+UseBiasedLocking -XX:BiasedLockingStartupDelay=0
  • 逃逸分析
-XX:+DoEscapeAnalysis -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError
  • 运行空间
-Xmx:最大可用内存;
-Xms:最小可用内存;
一般设置为一致,防止JVM动态调整;
  • 新生代
-Xmn:新生代容量大小;线程栈容量

-Xss:指定线程栈容量大小,默认1M;这里的值越大,相同内存的情况下JVM能够开放的线程越少

  • 开启Parallel Scavenge
新生代采用复制算法,老年代采用标记-整理算法。

################-XX:+UseParallelGC(年轻代),-XX:+UseParallelOldGC(老年代)

-XX:+UseParallelGC -XX:+UseParallelOldGC
  • 开启CMS收集器
-XX:+UseConcMarkSweepGC(old)

是一种以获取最短回收停顿时间为目标的收集器,适合注重用户体验应用上使用,他是HotSpot虚拟机第一款真正意义上的并发收集器;

缺点:
  1. 对CPU资源敏感,会和CPU抢占资源;
  2. 无法处理浮动垃圾,在并发清理阶段又产生垃圾;
  3. 使用回收算法(标记-清除)会导致手机结束时大量空间碎片产品,可以通过参数-XX:+UseCMSCompactAtFullCollection让JVM在执行完毕后清除后再做整理;
  4. 执行中的不确定性,会存在上一次垃圾回收还没有执行完,然后垃圾回收又被触发的情况;
  • 开启G1
-XX:+UseG1GC

是面向服务器的垃圾收集器,主要针对配置多课处理器及大容量内存的机器;

-XX:ParallelGCThreads:指定GC工作的线程数量

-XX:G1HeapRegionSize:指定分区大小(1MB~32MB,且必须是2的幂),默认将整堆划分为2048个分区

-XX:MaxGCPauseMillis:目标暂停时间(默认200ms)

-XX:G1NewSizePercent:新生代内存初始空间(默认整堆5%)

-XX:G1MaxNewSizePercent:新生代内存最大空间

-XX:TargetSurvivorRatio:Survivor区的填充容量(默认50%),Survivor区域里的一批对象(年龄1+年龄2+年龄n的多个年龄对象)总和超过了Survivor区域的50%,此时就会把年龄n(含)以上的对象都放入老年代

-XX:MaxTenuringThreshold:最大年龄阈值(默认15)

-XX:InitiatingHeapOccupancyPercent:老年代占用空间达到整堆内存阈值(默认45%),则执行新生代和老年代的混合收集(MixedGC),比如我们之前说的堆默认有2048个region,如果有接近1000个region都是老年代的region,则可能就要触发MixedGC了

-XX:G1HeapWastePercent(默认5%):gc过程中空出来的region是否充足阈值,在混合回收的时候,对Region回收都是基于复制算法进行的,都是把要回收的Region里的存活对象放入其他Region,然后这个Region中的垃圾对象全部清理掉,这样的话在回收过程就会不断空出来新的Region,一旦空闲出来的Region数量达到了堆内存的5%,此时就会立即停止混合回收,意味着本次混合回收就结束了。

-XX:G1MixedGCLiveThresholdPercent(默认85%):region中的存活对象低于这个值时才会回收该region,如果超过这个值,存活对象过多,回收的的意义不大。

-XX:G1MixedGCCountTarget:在一次回收过程中指定做几次筛选回收(默认8次),在最后一个筛选回收阶段可以回收一会,然后暂停回收,恢复系统运行,一会再开始回收,这样可以让系统不至于单次停顿时间过长。

  • 堆设置
-Xms:初始堆大小

-Xmx:最大堆大小

-XX:NewSize=n:设置年轻代大小

-XX:NewRatio=n:设置年轻代和年老代的比值.如:为3,表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4

-XX:SurvivorRatio=n:年轻代中Eden区与两个Survivor区的比值.注意Survivor区有两个;默认为8,也就是说Eden占新生代的8/10,From幸存区和To幸存区各占新生代的1/10
-XX:MaxPermSize=n:设置持久代大小
注意:持久代大小不能超过系统本身容量,这里也是GC不能处理到的地方;
-XX:PermSize分配非堆最小内存,默认为物理内存的1/64;-XX:MaxPermSize分配最大内存,默认为物理内存的1/4。
  • 收集器设置
-XX:+UseSerialGC:设置串行收集器

-XX:+UseParallelGC:设置并行收集器

-XX:+UseParalledlOldGC:设置并行年老代收集器

-XX:+UseConcMarkSweepGC:设置并发收集器

  • 垃圾回收统计信息
-XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:filename
  • 并行收集器设置
-XX:ParallelGCThreads=n:设置并行收集器收集时使用的CPU数.并行收集线程数。

-XX:MaxGCPauseMillis=n:设置并行收集最大暂停时间;

-XX:GCTimeRatio=n:设置垃圾回收时间占程序运行时间的百分比.公式为1/(1+n);
  • 并发收集器设置
-XX:+CMSIncrementalMode:设置为增量模式.适用于单CPU情况。

-XX:ParallelGCThreads=n:设置并发收集器年轻代收集方式为并行收集时,使用的CPU数.并行收集线程数。

  • 打印加载的类
-XX:+TraceClassLoading
  • IO内存控制
-XX:MaxDirectMemorySize:用于指定方法区之外的直接内存大小;
  • 元空间大小设置
-XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m
默认为:21M,是一个触发Full GC的阈值;
  • 打印所有JVM参数
java -XX:+PrintFlagsInitial:表示打印出所有参数选项的默认值
java -XX:+PrintFlagsFinal:表示打印出所有参数选项在运行程序时生效的值