Java VM 启动参数详解

  1. 云栖社区>
  2. 博客>
  3. 正文

Java VM 启动参数详解

一朝一夕 2018-10-14 15:47:00 浏览605
展开阅读全文

Java VM 启动参数详解

@Date 2017.05.24


打印输出相关参数

-verbose

  • 打印加载类的详细信息

-verbose:gc

  • 打印虚拟机中GC的详细情况:显示最忙和最空闲收集行为发生的时间、收集前后的内存大小、收集需要的时间等

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/admin/logs/java.hprof

  • 虚拟机在出现内存溢出异常时Dump 出当前的内存堆转储快照

-XX:+TraceClassLoading

  • 打印加载类的详细信息

-XX:+PrintGCDetails

  • 详细了解GC中的变化

-XX:+PrintGCDateStamps

  • 了解垃圾收集发生的时间,自JVM启动以后以秒计量

-Xloggc:/home/admin/logs/gc.log

  • GC日志文件的路径

涉及堆相关的参数

-server

  • server模式下,新生代选择的是并行GC,旧生代选择的是并行GC
  • client模式下,新生代选择的是串行GC,旧生代选择的是串行GC

-Xms2g

  • 堆的初始值2g

-Xmx2g

  • 堆的最大值2g
  • PS:避免在运行时频繁调整Heap的大小,通常-Xms与-Xmx的值设成一样

-XX:MinHeapFreeRation=

  • 空余堆内存小于MinHeapFreeRation时,JVM会增大Heap到-Xmx指定的大小

-XX:MaxHeapFreeRation=

  • 空余堆内存大于MaxHeapFreeRation时,JVM会减小heap的大小到-Xms指定的大小

-Xmn1g

  • 新生代堆大小1G

-XX:SurvivorRatio=8

  • 默认32:1:1
  • 新生代的Eden区:From区:To区的比例为8:1:1

-XX:PermSize= (JDK7)

  • 永久代大小

-XX:MaxPermSize= (JDK7)

  • 永久代MAX大小

-XX:MetaspaceSize= (JDK8)

  • 代替PermSize,元空间大小

-XX:MaxMetaspaceSize= (JDK8)

  • 代替MaxPermSize,元空间最大值

回收算法

标记-清理

  • 直接清理
  • 效率高
  • 产生内存碎片

标记-复制

  • 两块内存区域,S1,S2
  • 不存在内存碎片
  • 占用双倍空间

标记-整理

  • 在标记-清理之后,让剩余存活的对象都向一端移动,并更新引用其对象的指针
  • 效率低
  • 不产生碎片

分代收集算法

  • 把Java堆分新生代和老年代
  • 在新生代用复制算法
  • 在老年代用标记-清理或标记-整理算法

垃圾清理类型

-XX:+UseSerialGC

  • Serial GC
  • 串行
  • 使用简单的标记、清除、压缩方法对年轻代和年老代进行垃圾回收,即Minor GC和Major GC
  • 适用于CPU配置较低,内存占用较少的单独Client应用模式

-XX:+UseParallelGC

  • Parallel GC
  • 并行
  • 收集方式同Serial GC一样
  • 产生N个线程来进行年轻代的垃圾收集
  • N默认=系统CPU核数

-XX:ParallelGCThreads=

  • 设置Parallel GC线程数量

-XX:+UseParallelOldGC

  • Parallel Old GC
  • 方式同Parallel GC
  • 主要是年轻代和年老代垃圾回收时都使用多线程收集

-XX:+UseConcMarkSweepGC

  • 并发标记清除(CMS)收集器
  • 短暂停顿并发收集器
    1. CMS-initial-mark:初始标记阶段(stop the world)
    2. CMS-concurrent-mark : 和应用线程并发执行,标记可达的对象
    3. CMS-concurrent-preclean(CMS-concurrent-preclean-start,CMS-concurrent-preclean) : 预清理(标记和应用线程是并发执行的,有些对象的状态在标记后会改变)
    4. CMS-concurrent-abortable-preclean : 进一步的预清理,减少Rescan阶段时间.使用到参数(-XX:CMSMaxAbortablePrecleanTime)
    5. Rescan阶段(stop the world) : 暂停应用线程,对对象进行重新扫描并标记
    6. CMS-concurrent-sweep : 并发的垃圾清理
    7. CMS-concurrent-reset : 下一次CMS GC重置相关数据结构
  • 对年老代进行垃圾收集
  • 年轻代使用的算法和Parallel一样
  • 适用于不能忍受长时间停顿要求快速响应的应用
  • !!!FULL GC
    1. concurrent-mode-failure : CMS GC时,有新的对象要进入年老代,但是年老代空间不足
    2. promotion-failed : Young GC时,存活对象从Eden区到Survivor区,但是Survivor区空间不足,需要到年老代,年老代空间也不足

-XX:CMSMaxAbortablePrecleanTime=

  • CMS GC在concurrent-abortable-preclean阶段使用的参数
  • 当abortable-preclean阶段执行达到这个时间时才会结束

-XX:+CMSClassUnloadingEnabled

  • 避免Perm区满引起的Full GC,开启CMS回收Perm区

-XX:CMSInitiatingOccupancyFraction=

  • 此参数值是一个比例(参考下一条)

-XX:+UseCMSInitiatingOccupancyOnly

  • 如果设置了此参数
  • 只有当年老代占用达到了-XX:CMSInitiatingOccupancyFraction参数所设定的比例时才会触发CMS

-XX:ParallelCMSThreads=

  • 设置CMS收集器的线程数量

-XX:+UseG1GC

  • G1垃圾收集器
  • 属于分代收集器
  • JDK7+,长远目标时代替CMS收集器
  • 并行的、并发的和增量式压缩短暂停顿的垃圾收集器
  • 缩短处理超大堆时产生的停顿
  • 相对于CMS的优势而言是内存碎片的产生率大大降低
  • G1收集器和其他的收集器运行方式不一样,不区分年轻代和年老代.它把堆空间划分为多个大小相等的区域,当进行垃圾收集时,它会优先收集存活对象较少的区域
  • 采用Remembered Set来避免全堆扫描

-XX:MaxGCPauseMillis=200

  • 设置GC的最大暂停时间为200ms
  • 如果MaxGCPauseMillis设置的过小,那么GC就会频繁,吞吐量就会下降
  • 如果MaxGCPauseMillis设置的过大,应用程序暂停时间就会变长

-XX:G1HeapRegionSize=

  • 设置的G1区域的大小
  • 值是2的幂,范围是1MB到32MB之间

-Dsun.rmi.dgc.server.gcInterval=2592000000
-Dsun.rmi.dgc.client.gcInterval=2592000000

  • 存在RMI调用时,默认会每分钟执行一次System.gc,可以通过此参数来设置大点的间隔

堆外内存相关参数

-XX:MaxDirectMemorySize=

  • 指定了DirectByteBuffer分配空间限额
  • DirectByteBuffer通过内存映射,使Java应用进程直接访问与文件相关联的虚拟地址空间,减少了文件拷贝带来的开销,提高了文件读取效率
  • 默认会调用Full GC来回收

-XX:+DisableExplicitGC

  • 禁用Full GC显示调用(禁用System.GC)
  • 会出现OOM: 当系统各方面性能良好,无Full GC且DirectByteBuffer所占用的空间大于-Xmx分配的空间.
    因为DirectByteBuffer会不断地在Native堆分配空间,它的引用进入了Old区,Old区保存大量的引用,而不能被回收,最终会导致Native堆空间不足
  • 可以通过设置-XX:MaxDirectMemorySize=几十M,使OOM来得更早一些

-XX:+ExplicitGCInvokesConcurrent

  • 使用此参数,在进行堆外内存Full GC时,使用CMS并发GC,减少单纯的Full GC的卡顿时间,提高GC效率

other options

-Dsun.net.client.defaultConnectTimeout=10000
-Dsun.net.client.defaultReadTimeout=30000

  • 设置默认的Http请求的连接超时时间和读取超时时间

-Dfile.encoding=UTF-8

  • 设置文件流编码

-agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=n

  • 开放8000端口,支持远程DEBUG

SpringBoot启动参数样例

机器配置4核8G

java -server 
-Xms2g 
-Xmx2g 
-Xmn1g 
-XX:MetaspaceSize=256m 
-XX:MaxMetaspaceSize=256m 
-XX:MaxDirectMemorySize=1g 
-XX:SurvivorRatio=10 
-XX:+UseConcMarkSweepGC 
-XX:CMSMaxAbortablePrecleanTime=5000 
-XX:+CMSClassUnloadingEnabled 
-XX:CMSInitiatingOccupancyFraction=80 
-XX:+UseCMSInitiatingOccupancyOnly 
-XX:+ExplicitGCInvokesConcurrent 
-Dsun.rmi.dgc.server.gcInterval=2592000000 
-Dsun.rmi.dgc.client.gcInterval=2592000000 
-XX:ParallelGCThreads=4 
-Xloggc:/home/admin/logs/gc.log 
-XX:+PrintGCDetails 
-XX:+PrintGCDateStamps 
-XX:+HeapDumpOnOutOfMemoryError 
-XX:HeapDumpPath=/home/admin/logs/java.hprof 
-Djava.awt.headless=true 
-Dsun.net.client.defaultConnectTimeout=10000 
-Dsun.net.client.defaultReadTimeout=30000 
-Dfile.encoding=UTF-8

网友评论

登录后评论
0/500
评论
一朝一夕
+ 关注