jvm监控及问题排查
文章目录
一、简介
这里对运行中的java虚拟机jvm(hotspot虚拟机,其上运行着java程序)监控及问题排查进行介绍。
二、知识点
2.1 jvm内存区域
jvm内存划分为几个不同的区域,如下:
- 程序计数器:线程私有(每个线程都有独立的程序计数器),记录当前线程执行的字节码指令。
- 虚拟机栈(本地方法栈类似):线程私有,方法执行时会创建栈帧,方法的执行过程对应着栈帧在虚拟机栈中从入栈到出栈的过程。
- java堆:所有线程共享,存放对象实例和数组。通常分为新生代(包含eden区、from service区、to service区)和老年代。堆的大小可以通过-Xms和-Xmx控制。
- 方法区:所有线程共享,用于存储jvm加载的类信息、常量、静态变量等数据。按分代划分,可称为永久代,使用-XX:MaxPermSize设置上限。
2.2 常用垃圾回收器
java中内存是动态分配的,对用就有垃圾收集,采用的算法有标记-清除(mark-sweep)算法、复制(copying)算法、标记-整理(mark-compact)算法。垃圾收集针对的是java堆和方法区(程序计数器、虚拟机栈、本地方法栈为线程私有,随着线程生和灭)。常用垃圾收集器有:
- Serial收集器:单线程收集器,垃圾收集时会暂停(stop the world)其他所有工作线程,直到收集结束。简单高效,用于新生代收集。
- ParNew收集器:serial收集器的多线程版本。用于新生代收集。
- Parallel Scavenge收集器:采用复制算法、并行的、吞吐量优先的多线程收集器。用于新生代收集。
- Serial old收集器:采用标记-整理算法的单线程收集器。serial收集器的老年代版本。用于老年代收集。
- Parallel old收集器:采用标记-整理算法的多线程收集器。parallel scavenge收集器的老年代版本。用于老年代收集
- cms(concurrent mark sweep)收集器:采用标记-清除算法、最短停顿时间的多线程收集器。
- G1收集器:整体采用标记-整理算法、基于region(整个java堆划分为多个大小相等的独立区域)管理整个堆(不需要其他收集器配合)、降低和可预测停顿的多线程收集器。
2.3 监控的内容
监控的内容有:
- jvm配置信息
- jvm内存使用
- jvm线程信息
三、常用工具
3.1 jps
查看jvm进程。
格式:jps [option]
option:
-l:显示运行类的完整包
-q:只显示进程号
-m:显示给main方法的参数
-v:显示给jvm的完整参数
示例:
输入:jps -l
输出:
17419 com.dragon.study.msa_register_center.MsaRegisterCenterApplication
3.2 jinfo
查看虚拟机配置信息。
格式:jinfo vmid
3.3 jstat
查看堆内存使用情况,类加载的数量等。
格式:jstat [ -option vmid [ interval [s|ms] [count] ] ]
option:
-options:查看可用参数
-class:类加载统计
-compiler
-gc:查看堆内存各区域使用情况
-gccapacity
-gccause:堆内存各区域使用占比,以及最后一次和当前(当前可能没有)引发垃圾回收的诱因
-gcmetacapacity
-gcn