czb1n

不是谁的谁,在乎你是你

0%

JVM基础

简介

  • JVM(Java Virtual Machine),顾名思义是Java的虚拟机,是JRE的一部分。

参数说明

java -X 可查看所有X参数

  • 堆大小:
    1
    2
    3
    -Xms(最小)
    -Xmx(最大)
    -Xmn(新生代大小)
  • 栈大小:
    1
    2
    -Xss(栈容量, 在线程较多的情况, 该值越大越容易内存溢出)
    -Xoss(本地方法栈, HotSpot不区分虚拟机栈和本地方法栈, 所以该参数在HotSpot中无效)
  • 方法区大小: (1.7/1.8 方法区的实现由永久代转换为元空间,字符串常量移动到堆中。元空间并不在虚拟机中,而是使用本地内存。)
    1
    2
    3
    4
    5
    6
    7
    -XX:PermSize
    -XX:MaxPermSize
    JDK1.8 中 PermSize 和 MaxPermSize 已无效。
    -XX:MetaspaceSize
    -XX:MaxMetaspaceSize
    -XX:MinMetaspaceFreeRatio,在GC之后,最小的Metaspace剩余空间容量的百分比,减少为分配空间所导致的垃圾收集
    -XX:MaxMetaspaceFreeRatio,在GC之后,最大的Metaspace剩余空间容量的百分比,减少为释放空间所导致的垃圾收集
  • 直接内存大小:
    1
    -XX: MaxDirectMemorySize(若不指定则和堆最大值一致)
  • 内存溢出Dump出异常快照:
    1
    -XX:+HeapDumpOnOutOfMemoryError
  • 设置大对象达到一定大小则直接进入老年代,可避免大对象导致在新生代中发生大量内存复制:
    1
    -XX:PretenureSizeThreshold 指定大小(仅对Serial和ParNew有效, 单位为字节)
  • 设置进入老年代的年龄阈值:(默认为15)
    1
    2
    3
    -XX:MaxTenuringThreshold
    (如果新生代中的Survivor仲的相同年龄的对象大于Survivor空间的一半, 那么大于这个年龄的对象就直接进入老年代,
    不受这个参数影响)
  • 吞吐量优先收集器: Parallel Scavenge / Parallel Old :
    1
    2
    3
    -XX:MaxGCPauseMillis 最大停顿时间, 会影响新生代的内存和吞吐量, 并非越小越好
    -XX:GCTimeRatio 吞吐量的大小(整数1-99)
    -XX:+UseAdaptiveSizePolicy 虚拟机动态调整停顿时间或者吞吐量
  • CMS(Concurrent Mark Sweep)收集器:
    1
    2
    3
    4
    5
    更短的回收停顿时间
    允许对类进行卸载
    -XX:+CMSClassUnloadingEnabled
    允许对方法区进行清理
    -XX:+CMSPermGenSweepingEnabled
  • 查看本机参数默认值
    1
    java -XX:+PrintFlagsInitial
  • 取消偏向锁 (适用于多线程的高并发应用)
    1
    -XX:-UseBiasedLocking
  • 指定GC日志的输出路径
    1
    -Xloggc:路径
  • 启动滚动日志
    1
    2
    3
    -XX:+UseGCLogFileRotation
    -XX:NumberOfGCLogFiles=10
    -XX:GCLogFileSize=10M
  • 输出JVM导致应用停顿的所有时间
    1
    2
    3
    -XX:+PrintGCApplicationStoppedTime
    -XX:+PrintGCDateStamps
    -XX:+PrintGCDetails

其他基础

  • 分代收集算法:
    1
    2
    新生代 > 复制算法
    老年代 > 标记-清理 / 标记-整理
  • 垃圾收集器:
    1
    2
    SafePoint SafeRegion "Stop The World" 停顿时间(停掉用户线程来进行垃圾收集)
    吞吐量 = 运行用户代码时间 / (运行用户代码时间 + 垃圾收集时间)

JDK工具

  1. jps: 列出虚拟机正在进行的进程 jps -lv (包含主类和参数)
  2. jstat: 列出虚拟机进程的统计信息
  • S0C:第一个幸存区的大小
  • S1C:第二个幸存区的大小
  • S0U:第一个幸存区的使用大小
  • S1U:第二个幸存区的使用大小
  • EC:伊甸园区的大小
  • EU:伊甸园区的使用大小
  • OC:老年代大小
  • OU:老年代使用大小
  • MC:方法区大小
  • MU:方法区使用大小
  • CCSC:压缩类空间大小
  • CCSU:压缩类空间使用大小
  • YGC:年轻代垃圾回收次数
  • YGCT:年轻代垃圾回收消耗时间
  • FGC:老年代垃圾回收次数
  • FGCT:老年代垃圾回收消耗时间
  • GCT:垃圾回收消耗总时间
  1. jstack: 打印线程