zoukankan      html  css  js  c++  java
  • jmap与jstat工具实战分析

    在上一节【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是不是在不断变化:

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

  • 相关阅读:
    黄聪:解决Web部署 svg/woff/woff2字体 404错误
    黄聪:C#中HtmlAgilityPack判断是否包含或不包含指定的属性或值
    黄聪:GeckoFX如何引用jquery文件并执行自定义JS
    黄聪:css3实现图片划过一束光闪过效果(图片光影掠过效果)
    黄聪:C#带cookie模拟登录百度
    黄聪:如何为IIS增加svg和woff等字体格式的MIME
    黄聪:微信支付错误两个问题的解决:curl出错,错误码:60
    黄聪:《跟黄聪学WordPress插件开发》
    黄聪:GeckoWebBrowser多窗口独立cookie
    黄聪:远程连接mysql数据库注意事项记录(远程连接慢skip-name-resolve)
  • 原文地址:https://www.cnblogs.com/webor2006/p/10667788.html
Copyright © 2011-2022 走看看