JVM(8)——工具篇

举报
小白弟弟 发表于 2022/01/07 01:46:18 2022/01/07
【摘要】 @[TOC] 1. JDK 内置命令行工具 1.1、jps/jinfojps -> 显示进程号jps -mlv -> 把所有的运行的参数运行出来jinfo在mac有bug解决办法:升级成jdk8以上 1.2、jstatjstat -options-class 类加载(Class loader)信息统计-compiler JIT 即时编译器相关的统计信息-gc GC 相关的堆内存信息...

@[TOC]

1. JDK 内置命令行工具

在这里插入图片描述

在这里插入图片描述

1.1、jps/jinfo

jps -> 显示进程号
在这里插入图片描述

jps -mlv -> 把所有的运行的参数运行出来
在这里插入图片描述

jinfo在mac有bug
在这里插入图片描述

解决办法:升级成jdk8以上

1.2、jstat

jstat -options
-class 类加载(Class loader)信息统计
-compiler JIT 即时编译器相关的统计信息
-gc GC 相关的堆内存信息。 用法: jstat -gc -h 10 -t 864 1s 20
-gccapacity 各个内存池分代空间的容量
-gccause 看上次 GC,本次 GC(如果正在 GC 中)的原因, 其他输出和 -gcutil 选项一致
-gcnew 年轻代的统计信息。(New = Young = Eden + S0 + S1) -gcnewcapacity 年轻代空间大小统

-gcold 老年代和元数据区的行为统计
-gcoldcapacity old 空间大小统计
-gcmetacapacity meta 区大小统计
-gcutil GC 相关区域的使用率(utilization)统计
-printcompilation 打印 JVM 编译统计信息

详细 jstat -gc pid 10 10
在这里插入图片描述

解释:
在这里插入图片描述

概率统计 jstat -gcutil pid 10 10
在这里插入图片描述

解释:
在这里插入图片描述

1.3、jmap

  • heap 打印堆内存(/内存池)的配置和使用信息。
  • histo 看哪些类占用的空间最多, 直方图。
  • dump:format=b,file=xxxx.hprof Dump 堆内存。
    使用
    jmap -heap pid
    jmap -histo pid
    jmap -dump:format=b,file=3826.hprof

1.4、jstack == kill -3

-F 强制执行 thread dump,可在 Java 进程卡死(hung 住)时使用,此选项可能需要系统权限。
-m 混合模式(mixed mode),将 Java 帧和native 帧一起输出,此选项可能需要系统权限。
-l 长列表模式,将线程相关的 locks 信息一起输出,比如持有的锁,等待的锁。
在这里插入图片描述

1.5、jcmd*

示例:
jcmd pid VM.version
jcmd pid VM.flags
jcmd pid VM.command_line
jcmd pid VM.system_properties
jcmd pid Thread.print
jcmd pid GC.class_histogram
jcmd pid GC.heap_info

在这里插入图片描述

使用:
在这里插入图片描述

1.6、jrunscript/jjs

当 curl 命令用: jrunscript -e “cat('http://www.baidu.com’)"”)
执行 js 脚本片段 jrunscript -e “print(‘hello,kk.jvm’+1)”
执行 js 文件 jrunscript -l js -f /XXX/XXX/test.js
在这里插入图片描述

2、内置图形化工具

2.1、jconsole

共有 6 个面板

第一个为概览,四项指标具体为:

  • 堆内存使用量:此处展示的就是前面 Java 内存模型课程中提到的堆内存使用情
    况,从图上可以看到,堆内存使用了 94MB 左右,并且一直在增长。

  • 线程:展示了 JVM 中活动线程的数量,当前时刻共有 17 个活动线程。

  • 类:JVM 一共加载了 5563 个类,没有卸载类。

  • CPU 占用率:目前 CPU 使用率为 0.2%,这个数值非常低,且最高的时候也不
    到 3%,初步判断系统当前并没有什么负载和压力。

    有如下几个时间维度可供选择:
    1分钟、5分钟、10分钟、30分钟、1小时、2小时、3小时、6小时、12小时、1
    天、7天、1个月、3个月、6个月、1年、全部,一共是16档。
    当我们想关注最近1小时或者1分钟的数据,就可以选择对应的档。旁边的3个标
    签页(内存、线程、类),也都支持选择时间范围。
    在这里插入图片描述


内存图表包括:
• 堆内存使用量,主要包括老年代(内存池 “PS Old Gen”)、新生代(“PS Eden Space”)、存活区(“PS Survivor Space”);
• 非堆内存使用量,主要包括内存池“Metaspace”、“Code Cache”、“Compressed Class Space”等。可以分别选择对应的 6 个内存池。通过内存面板,我们可以看到各个区域的内存使用和变化情况,并且可以:

  • 1.手动执行 gc,见图上的标号1,点击按钮即可执行 JDK 中 的 System.gc()
  • 2.通过图中右下角标号 2 的界面,可以看到各个内存池的百
    分比使用率,以及堆/非堆空间的汇总使用情况。
  • 3.从左下角标号 3 的界面,可以看到 JVM 使用的垃圾收集器,
    以及执行垃圾收集的次数,以及相应的时间消耗。

在这里插入图片描述


  • 线程面板展示了线程数变化信息,以及监测到
    的线程列表。
  • 我们可以常根据名称直接查看线程的状态(运
    行还是等待中)和调用栈(正在执行什么操
    作)。
  • 特别地,我们还可以直接点击“检测死锁”按
    钮来检测死锁,如果没有死锁则会提示“未检
    测到死锁”。

在这里插入图片描述


类监控面板,可以直接看到 JVM 加载和卸载的
类数量汇总信息,以及随着时间的动态变化。

在这里插入图片描述


VM 概要的数据有五个部分:

  • 第一部分是虚拟机的信息;
  • 第二部分是线程数量,以及类加载的汇
    总信息;
  • 第三部分是堆内存和 GC 统计;
  • 第四部分是操作系统和宿主机的设备信
    息,比如 CPU 数量、物理内存、虚拟
    内存等等;
  • 第五部分是 JVM 启动参数和几个关键
    路径,这些信息其实跟 jinfo 命令看到
    路径,这些信息其实跟 jinfo 命令看到
    的差不多。

在这里插入图片描述

2.2、jvisualvm

在这里插入图片描述

2.3、jmc

飞行记录

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。