当前位置: 首页 > web >正文

JVM 监控

JVM 监控

1 官方文档

  • Java平台,标准版工具参考
  • https://docs.oracle.com/javase/8/docs/technotes/tools/unix/toc.html
  • jstat
  • https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jstat.html

http://www.importnew.com/all-posts

  • Jps
  • jmap和jhat
  • Jstat
  • Jstack
  • jinfo

2 jps

jps是jdk提供的一个查看当前java进程的小工具

命令格式:jps [options ] [ hostid ]

  • -q:只显示pid
  • -m:输出main method的参数
  • -l:输出完全的包名,应用主类名,jar的完全路径名
  • -v:输出传递给JVM的参数
  • -V:输出通过flag文件传递到JVM中的参数(.hotspotrc文件或-XX:Flags=所指定的文件
  • -Joption:传递参数到vm,例如:-J-Xms512m

列出远程服务器192.168.0.77机器所有的jvm实例,采用rmi协议,默认连接端口为1099
(前提是远程服务器提供jstatd服务)

3 jmap和jhat

jmap是JDK自带的工具软件,主要用于打印指定Java进程(或核心文件、远程调试服务器)的共享对象内存映射或堆内存细节。可以使用jmap生成Heap Dump。

jmap -histo[:live] <pid>

打印堆的柱状图。其中包括每个Java类、对象数量、内存大小(单位:字节)、完全限定的类名。打印的虚拟机内部的类名称将会带有一个’*’前缀。如果指定了live子选项,则只计算活动的对象。

jmap -dump:format=b,file=heapDump.hprof <pid>jhat heapDump

将某个进程的堆dump文件导出到heapDump文件中。使用jhat命令,就启动了一个http服务,端口是7000,然后在访问http://localhost:7000/

jhat(Java Heap Analysis Tool),是一个用来分析java的堆情况的命令。之前的文章讲到过,使用jmap可以生成Java堆的Dump文件。生成dump文件之后就可以用jhat命令,将dump文件转成html的形式,然后通过http访问可以查看堆情况。

在此要注意,一般不会直接在服务器上进行分析,因为jhat是一个耗时并且耗费硬件资源的过程,一般把服务器生成的dump文件复制到本地或其他机器上进行分析。

4 jstat

用于监控虚拟机各种运行状态信息的命令行工具。他可以显示本地或远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据,在没有GUI图形的服务器上,它是运行期定位虚拟机性能问题的首选工具。

一个极强的监视VM内存工具。可以用来监视VM内存内的各种堆和非堆的大小及其内存使用量。

[www@idc02-waibao-huidian ]$ jstat -help
Usage: jstat -help|-optionsjstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]Definitions:<option>      An option reported by the -options option<vmid>        Virtual Machine Identifier. A vmid takes the following form:<lvmid>[@<hostname>[:<port>]]Where <lvmid> is the local vm identifier for the targetJava virtual machine, typically a process id; <hostname> isthe name of the host running the target Java virtual machine;and <port> is the port number for the rmiregistry on thetarget host. See the jvmstat documentation for a more completedescription of the Virtual Machine Identifier.<lines>       Number of samples between header lines.<interval>    Sampling interval. The following forms are allowed:<n>["ms"|"s"]Where <n> is an integer and the suffix specifies the units as milliseconds("ms") or seconds("s"). The default units are "ms".<count>       Number of samples to take before terminating.-J<flag>      Pass <flag> directly to the runtime system.

jstat -class pid:显示加载class的数量,及所占空间等信息。

列名说明
Loaded加载class的数量
Bytes所占用空间大小
Unloaded未加载数量
Bytes未加载占用空间
Time时间

jstat -compiler pid :显示VM实时编译的数量等信息。

列名说明
Compiled编译数量。
Failed失败数量
Invalid不可用数量
Time时间
FailedType失败类型
FailedMethod失败的方法

jstat -gc pid :可以显示gc的信息,查看gc的次数,及时间。

列名说明
S0C第一个幸存区的大小
S1C第二个幸存区的大小
S0U第一个幸存区的使用大小
S1U第二个幸存区的使用大小
EC伊甸园区的大小
EU伊甸园区的使用大小
OC老年代大小
OU老年代使用大小
MC方法区大小
MU方法区使用大小
CCSC压缩类空间大小
CCSU压缩类空间使用大小
YGC年轻代垃圾回收次数
YGCT年轻代垃圾回收消耗时间
FGC老年代垃圾回收次数
FGCT老年代垃圾回收消耗时间
GCT垃圾回收消耗总时间

jstat -gccapacity pid 堆内存统计

列名说明
NGCMN新生代最小容量
NGCMX新生代最大容量
NGC当前新生代容量
S0C第一个幸存区大小
S1C第二个幸存区的大小
EC伊甸园区的大小
OGCMN老年代最小容量
OGCMX老年代最大容量
OGC当前老年代大小
OC当前老年代大小
MCMN最小元数据容量
MCMX最大元数据容量
MC当前元数据空间大小
CCSMN最小压缩类空间大小
CCSMX最大压缩类空间大小
CCSC当前压缩类空间大小
YGC年轻代gc次数
FGC老年代GC次数

jstat -gcnew pid 新生代垃圾回收统计

列名说明
S0C第一个幸存区大小
S1C第二个幸存区的大小
S0U第一个幸存区的使用大小
S1U第二个幸存区的使用大小
TT对象在新生代存活的次数
MTT对象在新生代存活的最大次数
DSS期望的幸存区大小
EC伊甸园区的大小
EU伊甸园区的使用大小
YGC年轻代垃圾回收次数
YGCT年轻代垃圾回收消耗时间

jstat -gcnewcapacity pid new对象的信息及其占用量。新生代内存统计

列名说明
NGCMN新生代最小容量
NGCMX新生代最大容量
NGC当前新生代容量
S0CMX最大幸存1区大小
S0C当前幸存1区大小
S1CMX最大幸存2区大小
S1C当前幸存2区大小
ECMX最大伊甸园区大小
EC当前伊甸园区大小
YGC年轻代垃圾回收次数
FGC老年代回收次数

jstat -gcold pid : old对象的信息。 老年代垃圾回收统计

列名说明
MC方法区大小
MU方法区使用大小
CCSC压缩类空间大小
CCSU压缩类空间使用大小
OC老年代大小
OU老年代使用大小
YGC年轻代垃圾回收次数
FGC老年代垃圾回收次数
FGCT老年代垃圾回收消耗时间
GCT垃圾回收消耗总时间

jstat -gcoldcapacity pid old对象的信息及其占用量。

列名说明
OGCMN老年代最小容量
OGCMX老年代最大容量
OGC当前老年代大小
OC老年代大小
YGC年轻代垃圾回收次数
FGC老年代垃圾回收次数
FGCT老年代垃圾回收消耗时间
GCT垃圾回收消耗总时间

jstat -gcmetacapacity pid: 元数据空间统计

列名说明
MCMN最小元数据容量
MCMX最大元数据容量
MC当前元数据空间大小
CCSMN最小压缩类空间大小
CCSMX最大压缩类空间大小
CCSC当前压缩类空间大小
YGC年轻代垃圾回收次数
FGC老年代垃圾回收次数
FGCT老年代垃圾回收消耗时间
GCT垃圾回收消耗总时间

jstat -gcutil pid 1000 10 : 1000ms统计一次gc情况统计10次;

列名说明
S0幸存1区当前使用比例
S1幸存2区当前使用比例
E伊甸园区使用比例
O老年代使用比例
M元数据区使用比例
CCS压缩使用比例
YGC年轻代垃圾回收次数
FGC老年代垃圾回收次数
FGCT老年代垃圾回收消耗时间
GCT垃圾回收消耗总时间

jstat -printcompilation pid :当前VM执行的信息。

列名说明
Compiled最近编译方法的数量
Size最近编译方法的字节码数量
Type最近编译方法的编译类型。
Method方法名标识。

5 jstack

jstack 是java虚拟机自带的一种堆栈跟踪工具。

  • http://www.importnew.com/23761.html

jstack用于生成java虚拟机当前时刻的线程快照。线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。 线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做什么事情,或者等待什么资源。 如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。另外,jstack工具还可以附属到正在运行的java程序中,看到当时运行的java程序的java stack和native stack的信息, 如果现在运行的java程序呈现hung的状态,jstack是非常有用的。

So , jstack 命令主要用来查看Java线程的调用堆栈的,可以用来分析线程问题(如死锁)。

6 GUI监控工具

  • (Java自带监控工具)JConsole
  • (Java自带监控工具)Java VisualVM
  • jvmstat
  • YourKit Java Profiler
  • Perfino
  • Jprofiler
  • eclipse memory analyzer

7 eclipse memory analyzer

三个选项

  • leak suspects report 泄漏疑似报告
  • component report 组件报告
  • re-open previously run reports 重新打开以前运行的报表

8 GC

GC日志输出到控制台

启动参数说明
-XX:+PrintGCGC的简要信息
-XX:+PrintGCDetailsGC的详细信息
-XX:+PrintGCTimeStampsGC的时间信息
-XX:+PrintGCApplicationStoppedTimeGC造成的应用暂停的时间

GC信息输出到指定文件

启动参数说明
-Xloggc: gc.log将gc的信息输出到gc.log中

9 堆内存分配

  • JVM初始分配的堆内存由-Xms指定,默认是物理内存的1/64;
  • JVM最大分配的堆内存由-Xmx指定,默认是物理内存的1/4。
  • 默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;
  • 空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制。
  • 因此服务器一般设置-Xms、-Xmx 相等以避免在每次GC 后调整堆的大小。
  • 说明:如果-Xmx 不指定或者指定偏小,应用可能会导致java.lang.OutOfMemory错误,此错误来自JVM,不是Throwable的,无法用try…catch捕捉。

10 非堆内存分配

  • JVM使用-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64;
  • XX:MaxPermSize设置最大非堆内存的大小,默认是物理内存的1/4。

XX:MaxPermSize设置过小会导致java.lang.OutOfMemoryError: PermGen space 就是内存益出。
为什么会内存益出:

  1. 这一部分内存用于存放Class和Meta的信息,Class在被 Load的时候被放入PermGen space区域,它和存放Instance的Heap区域不同。
  2. GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的APP会LOAD很多CLASS 的话,就很可能出现PermGen space错误。
  3. 这种错误常见在web服务器对JSP进行pre compile的时候。
http://www.xdnf.cn/news/5464.html

相关文章:

  • 【Java学习笔记】多态
  • HTML5中的Microdata与历史记录管理详解
  • 安装typescript时,npm install -g typescript报错
  • .Net HttpClient 处理响应数据
  • 每日一题洛谷P8615 [蓝桥杯 2014 国 C] 拼接平方数c++
  • 被一个人影响情绪是爱吗?这 3 个真相越早明白越好
  • AI面经总结-试读
  • 深度解析六大AI爬虫工具:crawl4ai、FireCrawl、Scrapegraph-ai、Jina、SearXNG、Tavily技术对比与实战指南
  • COT思维链:SequentialChain 方法有哪些参数;优化后的提示词
  • ES面试题系列「一」
  • MySQL的索引分类
  • 软件体系结构(Software Architecture)
  • IDEA:如何设置最上面菜单栏一直显示出来
  • 图片转ICO图标工具
  • 一个网球新手的学习心得
  • 单链表设计与实现
  • 锁相放大技术:从噪声中提取微弱信号的利器
  • C PRIMER PLUS——第9节:动态内存分配、存储类别、链接和内存管理
  • 程序中的内存从哪里来?
  • arctan x 导数推理
  • Java 1.8(也称为Java 8)
  • 4.4 os模块
  • MySql事务索引
  • 图灵奖获得者经典论文系列(1969):迈向人工智能的步伐(马文·明斯基)
  • 2023 河南ccpc
  • Python与矢量网络分析仪3671E:通道插损自动化校准(Vscode)
  • AI(学习笔记第三课) 使用langchain进行AI开发(2)
  • VSCode1.101.0便携版|中英文|编辑器|安装教程
  • 大模型项目:普通蓝牙音响接入DeepSeek,解锁语音交互新玩法
  • 【React中useRef钩子详解】