在上一节【https://www.cnblogs.com/webor2006/p/10662363.html】最后其实是抛出了infoq关于元空间介绍的文章中所涉及到JDK自带的一些工具的使用,这次咱们来亲自来对文中提到的jmap和jstat工具进行实践,如下:

对于JDK自带的工具其实主要是分为两种:一种是命令行工具,另一种是GUI工具,其实GUI工具也就是对命令行工具的一个集成,那既然有了GUI工具还要什么命令行工具呢?其实现实是有些系统是不支持GUI的,所以对于命令行工具的掌握也是很有必要的。

jmap:

如InfoQ文章中所介绍的,它是用来查看类加载器数据的,当然也介绍了它的使用,不过咱们以纯小白的方式来看一下该命令的使用方式,当然是直接在命令行看一下它官方的使用帮助喽:

所以,为了演练该命令,咱们写一个简单的程序,然后里面写一个死循环来保持进程是活着,如下:

运行起来:

由于jmap需要知道进程ID,所以可以利用linux的这个稍复杂的命令来查看之,如下:

然后查到咱们程序相关的进程ID:

当然这种获取JVM进程的方式稍显复杂,其实有更加简便的命令来获取的,这个在之后会使用到,接下来我们使用一下该命令:

报异常了,不能连接到指定的进程,而且可以看到我们的IntelliJ IDEA的这个死循环的程序也挂掉了:

其实这是跟我机器上的当前版本有关,算是一个BUG,因为google官方对其有解释:

不过咱们不使用JDK9,而是使用JDK8往前的小版本既可,先来查看一下当前机器使用的JDK版本,如下:

其实使用92这个小版本就可以了,所以这里先将IntelliJ IDEA的JDK切到92这个版本,如下:

然后再次运行:

此时的jmap就得用92这个jdk的了,由于我当前path配的是171这个,为了方便我们直接进入到92这个版本的目录来执行jmap命令,如下:

此时注意一下执行此命令时会让程序停止运行一会,如下:

很明显能看到在计算时进程的输出卡住了,待jmap计算完成之后进程运行才恢复,下面来具体看一下该进程的类加载器的输出:

咱们来瞅下这个自定义的类加载器:

最后就是加载我们MyTest5类的应用类加载器了:

从这个输出再一次巩固了之前我们学习类加载器的相关知识,有了这个命令就可以直观当前进程运行的类加载器的关系了,还是很好用的。

另外jmap还有另一个参数,如下:

下面来使用一下:

xiongweideMacBook-Pro:classes xiongwei$ /Library/Java/JavaVirtualMachines/jdk1.8.0_92.jdk/Contents/Home/bin/jmap -heap 11971
Attaching to process ID 11971, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.92-b14 using thread-local object allocation.
Parallel GC with 4 thread(s) Heap Configuration:
MinHeapFreeRatio = 0
MaxHeapFreeRatio = 100
MaxHeapSize = 2147483648 (2048.0MB)
NewSize = 44564480 (42.5MB)
MaxNewSize = 715653120 (682.5MB)
OldSize = 89653248 (85.5MB)
NewRatio = 2
SurvivorRatio = 8
MetaspaceSize = 21807104 (20.796875MB)
CompressedClassSpaceSize = 1073741824 (1024.0MB)
MaxMetaspaceSize = 17592186044415 MB
G1HeapRegionSize = 0 (0.0MB) Heap Usage:
PS Young Generation
Eden Space:
capacity = 34078720 (32.5MB)
used = 3408368 (3.2504730224609375MB)
free = 30670352 (29.249526977539062MB)
10.001455453725962% used
From Space:
capacity = 5242880 (5.0MB)
used = 0 (0.0MB)
free = 5242880 (5.0MB)
0.0% used
To Space:
capacity = 5242880 (5.0MB)
used = 0 (0.0MB)
free = 5242880 (5.0MB)
0.0% used
PS Old Generation
capacity = 89653248 (85.5MB)
used = 0 (0.0MB)
free = 89653248 (85.5MB)
0.0% used 2154 interned Strings occupying 152240 bytes.
xiongweideMacBook-Pro:classes xiongwei$

下面简单来瞅一下输出:

以上是关于jmap常用的用法。

jstat:

如文章中所示:

所以咱们来使用一下,进程还是之前那个进程,因为死循环我木有退出,然后看一下它的官方用法介绍:

咱们按照文章中所列的用法执行一下:

其中如文章中所示,重点看MC和MU这两参数,其中MC的注释为:Current Metaspace Capacity(KB)当前元空间容量,也就是系统所分配的空间;MU为:Metaspace Utilization(KB)已经被使用元空间的大小,回到咱们程序来说:系统分配的元空间大小为4480kb,而当前已经使用的元空间的大小为773.9kb,而且有个细节,就是我们不断执行该命令,其MU基本上没有变化,如下:

这是因为咱们这个程序木有使用到元空间,如下:

而如之前所学,只有动态创建的类的信息才会往元空间当中存,所以咱们停止此程序,换之前的cglib程序,然后再来实验一下:

此时再来多次运行jstat命令,看MU是不是在不断变化:

嗯~~该命令还是很不错的~~

jmap与jstat工具实战分析的更多相关文章

  1. JVM监控工具之jmap、jstat、stack、jps、jstatd、jinfo、jhat、jdb

    1.jdb(The Java Debuger) jdb 用来对core文件和正在运行的Java进程进行实时地调试,里面包含了丰富的命令帮助您进行调试,它的功能和Sun studio里面所带的dbx非常 ...

  2. 如何在宿主机上执行容器里的jmap,jtack,jstat 命令获取信息(原创)

    一般情况下,我们要获取docker容器里的jvm信息只能进入容器后执行jmap,jstack,jstat 命令去获取,jstack,jstat还好,但是jmap dump的文件要拿出来,得先copy ...

  3. Crash工具实战-变量解析【转】

    转自:http://blog.chinaunix.net/uid-14528823-id-4358785.html Crash工具实战-变量解析 Crash工具用于解析Vmcore文件,Vmcore文 ...

  4. 实战分析Tomcat的类加载器结构(使用Eclipse MAT验证)

    一.前言 在各种Tomcat相关书籍,书上都提到了其类加载器结构: 在Tomcat 7或者8中,共享类和Catalina类加载器在catalina.properties中都是没配置的,请看: 所以,c ...

  5. JVM监控工具介绍jstack, jconsole, jinfo, jmap, jdb, jstat(复制)

    jstack -- 如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程 ...

  6. 性能测试专题:Locust工具实战之“蝗虫”降世

    阅读全文需5分钟. 1. 前言 在上一篇文章中,我们已经为大家介绍了什么是Locust,具体可参照:性能专题:Locust工具实战之开篇哲学三问,简单来说,Locust 是基于 Python 语言下的 ...

  7. linux下定位异常消耗的线程实战分析

    前言: 之前分享过一篇Linux开发coredump文件分析实战分享 ,今天再来分享一篇实战文章. 在我们嵌入式linux开发过程中,开发过程中我们经常会使用多进程.多线程开发.那么多线程使用过程中, ...

  8. 常用 Java 静态代码分析工具的分析与比较

    常用 Java 静态代码分析工具的分析与比较 简介: 本文首先介绍了静态代码分析的基 本概念及主要技术,随后分别介绍了现有 4 种主流 Java 静态代码分析工具 (Checkstyle,FindBu ...

  9. elk实战分析nginx日志文档

    elk实战分析nginx日志文档 架构: kibana <--- es-cluster <--- logstash <--- filebeat 环境准备:192.168.3.1 no ...

随机推荐

  1. 常见问题:计算机网络/完整HTTP访问

    域名解析 以浏览器进行HTTP访问为例,首先搜索自身DNS缓存(一般缓存1000条左右,仅缓存1分钟),若有且未过期,结束. 若未找到,则搜索操作系统的DNS缓存. 若未找到,尝试读取hosts文件. ...

  2. Clean Code 代码检查清单

    注释: 不恰当的信息:注释只应该描述有关代码和设计的技术性信息. 废弃的注释:过时.无关或不正确的注释就是废弃的注释. 冗余注释:注释应该谈及代码自身没提到的东西 糟糕的注释:值得编写的注释,也值得好 ...

  3. 阿里云 maven仓库地址配置

    1. maven 配置文件配置settings.xml中设置mirror节点 <mirror> <id>nexus-aliyun</id> <mirrorOf ...

  4. jvm误区--动态对象年龄判定

    原文链接:https://blog.csdn.net/u014493323/article/details/82921740 虚拟机并不是永远地要求对象的年龄必须达到了MaxTenuringThres ...

  5. 转:路由 router-view

    原文链接: 路由 router-view 路由,其实就是指向的意思,当我点击页面上的home按钮时,页面中就要显示home的内容,如果点击页面上的about 按钮,页面中就要显示about 的内容.H ...

  6. C之指针加减运算

    法则:1.指针减指针,语法正确,结果得一个整型值,表示两数值之间的对象类型的空间距离,而不是对象之间的字节数差值 2.指针加指针,语法错误,     3.指针加整形值,语法正确,表示后移N个空间单位 ...

  7. WUSTOJ 1335: Similar Word(Java)

    题目链接:1335: Similar Word Description It was a crummy day for Lur. He failed to pass to the CET-6 (Col ...

  8. k8s 启动pod的问题

    版本: k8s 1.5 docker 1.3 CentOS 7.6 使用命令 kubectl get pods输出no resources.解决方法是修改 apiserver 的配置文件 vim /e ...

  9. Springboot入门及配置文件介绍(内置属性、自定义属性、属性封装类)

    目的: 1.Springboot入门 SpringBoot是什么? 使用Idea配置SpringBoo使用t项目 测试案例 2.Springboot配置文件介绍 内置属性 自定义属性 属性封装类 Sp ...

  10. Luogu5290 [十二省联考2019] 春节十二响 【贪心】【堆】

    题目分析: 对于一个根,假设我们对每个子树分别求出了一种答案,那么怎么合并答案是最小的呢? 首先考虑这些答案里面最大的那个数字,它肯定要融合其它组里面的最大数字.以此类推 所以最好的合并方式是,每个子 ...