JVM常用参数

  • -xms512m 初始堆大小512M,默认物理内存的1/64
  • -Xmx512m 最大堆大小512M,默认物理内存的1/4

初始内存跟最大内存最好相等,防止内存不够时扩充内 存或者Full GC,导致性能降低

  • -XX:+HeapDumpOnOutofMemoryError 内存异常打印dump
  • -XX:NewSize=100m 新生代初始化内存的大小(需要小于-xmx)
  • -XX:MaxNewSize=100m 是新生代可被分配的内存的最大上限
  • -Xmn100m 新生代内存100m,同时对-XX:MaxNewSize和-XX:NewSize设置,一致可以避免动态调整
  • -XX:NewRatio=2 默认2表示新生代为年老代的1/2,占整个堆内存的1/3。
  • -XX:SurvivorRatio=8 默认8表示一个survivor区占用1/8的Eden内存,即1/10的新生代内存。

以上配置可以推出老年代内存512-100=412M

  • -XX:SurvivorRatio=8 新生代内存分配比例(8:1:1,总共10,如果配6,就是6:2:2)
  • -XX:MaxMetaspaceSize=256M 设置元空间最大值, 默认是-1, 即不限制, 或者说只受限于本地内存大小
  • -XX:MetaspaceSize=256M 指定元空间触发Full gc的初始阈值,默认是21M,达到该值就会触发 full gc进行类型卸载, 同时收集器会对该值进行调整: 如果释放了大量的空间, 就适当降低该值; 如果释放了很少的空间, 那么在不超 过-XX:MaxMetaspaceSize(如果设置了的话) 的情况下, 适当提高该值。

如果程序启动慢,观察是否在启动过程中频繁full gc,如果是,可能是程序比较大,因为Metaspace存放类的信息,很快达到了21M,频繁Full gc扩容,可以试着改大。建议MaxMetaspaceSize和MaxMetaspaceSize改成一样

  • ‐Xss1m 设置每个线程的栈大小,默认1M,通常够用,影响一个线程栈里能分配的栈帧数,太小了容易StackOverflowError

GC相关日志输出:

  • -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+PrintGCCause 打印GC日志,包括日期、时间、原因
  • -Xloggc:./gc-%t.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=100M 滚动输出GC日志,最多保留10个文件,每个文件100M
  • -XX:+PrintFlagsInitial 打印所有可用参数
  • -XX:+PrintFlagsFinal 打印在运行时生效值

JVM优化,就是尽可能让对象都在新生代里分配和回收,尽量别 让太多对象频繁进入老年代,避免频繁对老年代进行垃圾回收,同时给系统充足的内存大小,避免新生代频繁的进行垃圾回收。没有通用的调优参数,需要根据业务场景来。