# JVM参数

`java -XX:+PrintFlagsInitial` 查看本机的初始化参数 (JVM 出厂默认安装) `java -XX:+PrintFlagsFinal` 查看本机参数最终生效的实际值 (自己手动修改以后的JVM配置)

```shell
# 内存相关
-Xmx 最大堆大小，默认(MaxHeapFreeRatio参数可以调整)空余堆内存大于70%时，JVM会减少堆直到 -Xms的最小
限制 
-Xms 初始堆大小，默认为物理内存的1/64(<1GB)；默认(MinHeapFreeRatio参数可以调整)空余堆内存小于40%
时，JVM就会增大堆直到-Xmx的最大限制
-Xmn 新生代的内存空间大小（eden+ 2 survivor)。整个堆大小=新生代大小 + 老生代大小 + 永久代大小。 在保证堆大小不变的情况下，增大新生代后,将会减小老生代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。
-XX:SurvivorRatio 新生代中Eden区域与Survivor区域的容量比值，默认值为8。两个Survivor区与一个Eden区
的比值为2:8,一个Survivor区占整个年轻代的1/10。
-Xss 每个线程的堆栈大小。JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K。应根据应用的线程所
需内存大小进行适当调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是
有限制的，不能无限生成，经验值在3000~5000左右。
-XX:PermSize 设置永久代(perm gen)初始值。默认值为物理内存的1/64。 （永久代在1.8之后被废弃，使用Metaspace代替）
-XX:MaxPermSize 设置持久代最大值。物理内存的1/4。
-XX:MetaspaceSize 初始化的Metaspace大小，该值越大触发Metaspace GC的时机就越晚
-XX:MaxMetaspaceSize 限制Metaspace增长的上限，防止因为某些情况导致Metaspace无限的使用本地内存，影响到其他程序。
-XX:NewRatio 设置新生代占老年代的几分之几，比如-XX:NewRatio=4，说明新生代是老年代的1/4，占整个堆的1/5。
# gc日志
-XX:+PrintGC 输出GC日志
-XX:+PrintGCDetails 输出GC的详细日志
-XX:+PrintGCTimeStamps 输出GC的时间戳（以基准时间的形式）
-XX:+PrintGCDateStamps 输出GC的时间戳（以日期的形式，如 2013-05-04T21:53:59.234+0800）
-XX:+PrintHeapAtGC 在进行GC的前后打印出堆的信息
-XX:+PrintGCApplicationStoppedTime 打印”stop-the-world”（STW）暂停时间
-Xloggc:../logs/gc.log 日志文件的输出路径

# 设置gc收集器
-XX:+UseSerialGC 虚拟机运行在Client模式下的默认值，Serial + Serial Old
-XX:+UseParNewGC ParNew + Serial Old，在jdk1.8被废弃
-XX:+UseConcMarkSweepGC ParNew + CMS + SerialOld,Serial Old将作为CMS收集器出现Concurrent Mode Failure失败后的备用垃圾收集器
-XX:+UseParallelGC 虚拟机运行在Server模式下的默认值，Parallel Scavenge + Serial Old（PS Mark Sweep）
-XX:+UseParallelOldGC Parallel Scavenge + Parallel Old
-XX:UseG1GC G1

# 设置cms GC参数
-XX:CMSInitiatingOccupancyFraction：在使用CMS收集器的情况下，指定老年代被使用的内存空间的阈值，达到该阈值则触发Full GC。
-XX:+UseCMSInitiatingOccupancyOnly：指定用设定的回收阈值(-XX:CMSInitiatingOccupancyFraction参数的值),如果不指定,JVM仅在第一次使用设定值,后续则会根据运行时采集的数据做自动调整，如果指定了该参数，那么每次JVM都会在到达规定设定值时才进行GC。不过大多数情况下，JVM都能够作出更好的垃圾收集决策，所以如果不是很有信心的话，不建议使用该参数，放心的把决定权交给JVM。
-XX:+CMSClassUnloadingEnabled：CMS 不会对新生代做垃圾回收，默认只针对老年代进行垃圾回收。此外，CMS 还可以开启对永久代的垃圾回收（或元空间），避免由于 PermGen 空间耗尽带来 Full GC。
-XX:+CMSParallelInitialMarkEnabled：表示在初始标记阶段多线程执行，减少STW时间。

# 设置GC参数
-XX:+DisableExplicitGC：这个参数作用是禁止代码中显示调用GC。代码如何显示调用GC呢，通过System.gc()函数调用。如果加上了这个JVM启动参数，那么代码中调用System.gc()没有任何效果，相当于是没有这行代码一样。
-XX:CMSFullGCsBeforeCompaction={n}：表示多少次不压缩的FuulGC后再压缩

# 查看JVM的垃圾收集器
 java -XX:+PrintCommandLineFlags -version
# 查看运行中的java进程使用的垃圾收集器
jmap -heap {vmid}


# 其他
-XX:-OmitStackTraceInFastThrow：关闭JVM对相同异常打印次数过多（默认128次）时的优化（默认打开），只针对以下异常会优化（NullPointerException，ArrayIndexOutOfBoundsException，ArithmeticException，ArrayStoreException，ClassCastException）


```
