4.3.1.如何配置垃圾收集器

  • 首先是内存大小问题,基本上每一个内存区域我都会设置一个上限,来避免溢出问题,比如元空间。
  • 通常,堆空间我会设置成操作系统的 2/3,超过 8GB 的堆,优先选用 G1
  • 然后我会对 JVM 进行初步优化,比如根据老年代的对象提升速度,来调整年轻代和老年代之间的比例
  • 依据系统容量、访问延迟、吞吐量等进行专项优化,我们的服务是高并发的,对 STW 的时间敏感
  • 我会通过记录详细的 GC 日志,来找到这个瓶颈点,借用 GCeasy 这样的日志分析工具,定位问题

    4.3.2.常用命令

    jps、jinfo、jstat、jstack、jmap

4.3.2.1.jps:查看java进程及相关信息

  1. jps -l 输出jar包路径,类全名
  2. jps -m 输出main参数
  3. jps -v 输出JVM参数

4.3.2.2.jinfo:查看JVM参数

  1. jinfo 11666
  2. jinfo -flags 11666
  3. Xmx、Xms、Xmn、MetaspaceSize

4.3.2.3.jstat:查看JVM运行时的状态信息,包括内存状态、垃圾回收

  1. jstat [option] LVMID [interval] [count]
  2. 其中LVMID是进程id,interval是打印间隔时间(毫秒),count是打印次数(默认一直打印)
  3. option参数解释:
  4. -gc 垃圾回收堆的行为统计
  5. -gccapacity 各个垃圾回收代容量(young,old,perm)和他们相应的空间统计
  6. -gcutil 垃圾回收统计概述
  7. -gcnew 新生代行为统计
  8. -gcold 年老代和永生代行为统计

4.3.2.4.jstack:查看JVM线程快照,jstack命令可以定位线程出现长时间卡顿的原因,例如死锁,死循环

  1. jstack [-l] <pid> (连接运行中的进程)
  2. option参数解释:
  3. -F 当使用jstack <pid>无响应时,强制输出线程堆栈。
  4. -m 同时输出java和本地堆栈(混合模式)
  5. -l 额外显示锁信息

4.3.2.5.jmap:可以用来查看内存信息(配合jhat使用)

  1. jmap [option] <pid> (连接正在执行的进程)
  2. option参数解释:
  3. -heap 打印java heap摘要
  4. -dump:<dump-options> 生成java堆的dump文件