• 【JVM技术专题】精心准备了一套JVM分析工具的锦囊「JConsole补充篇」


    前提概要

    本篇文章主要针对于之前本系列文章的补充版,之前落下了Jconsole分析工具,所以为了了却这个遗憾,所以小编又开了这篇文章,主要针对于Jconsole工具进行相关的应用性能分析。

    初识JConsole

    • 【Jconsole(Java Monitoring and Management Console),内存监控管理控制台】

      • Jconsole是JDK自带的内置应用监控和性能分析工具,在%JAVA_HOME%/bin目录下可以找到jconsole的可执行文件。

      • Jconsole可以实现连接远程应用程序和本地程序应用,也可以同时监控几个jvm

      • Jconsole可以运行在java应用程序的资源消耗和性能进行监控,并统计计算相关图形报表,提供强大的可视化界面

      • Jconsole本身占用的服务器内存很小,甚至可以说几乎不消耗

      • 它用于对JVM中内存,线程和类等的监控。可使用JTop插件。

      • 而且结合Jstat,可以有效监控到java内存的变动情况,以及引起变动的原因。在项目追踪内存泄露问题时,很实用。

    JConsole进行工作

    分析器有自己的开销,因此最好的办法就是花点时间来弄清是什么开销。发现JConsole开销最简单的办法是,首先独自运行一个应用程序,然后在分析器下运行,并测量差异

    • 使用 -verbose:gc 尝试运行SwingSet2来查看垃圾收集清理,然后运行同一个应用程序并将JConsole分析器连接到它。

    • 当JConsole连接好了之后,一个稳定的 GC 清理流出现,否则不会出现。这就是分析器的性能开销。

    Jconsole本地监控

    • 点击可执行文件(windows)

    • 启动命令服务
    jconsole [ -interval=n ] [ -notile ] [ -pluginpath  ] [ -version ] [ connection ... ]
    
      -interval   将更新间隔设置为 n 秒 (默认值为 4 秒)
      -notile     初始不平铺窗口 (对于两个或多个连接)
      -pluginpath 指定 jconsole 用于查找插件的路径
      -version    输出程序版本
    
      connection = pid || host:port || JMX URL (service:jmx:<协议>://...)
      pid         目标进程的进程 ID
      host        远程主机名或 IP 地址
      port        远程连接的端口号
    
      -J          指定运行 jconsole 的 Java 虚拟机
                  的输入参数
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 访问页面

    JConsole查看当前程序/进程的全局情况

    JConsole 基本包括以下基本功能:概述、内存、线程、类、VM概要、MBean

    单独查看内存使用情况和GC回收情况

    内存页签相对于可视化的jstat 命令,用于监视受收集器管理的虚拟机内存。

    “内存”选项卡具有“执行GC”按钮,可以随时单击该按钮以执行垃圾回收。

    该图表显示了Java VM随时间的内存使用情况,堆和非堆内存以及特定内存池的内存使用情况。

    Java VM管理两种内存:堆内存和非堆内存,这两种内存都是在Java VM启动时创建的。

    (1)堆内存是运行时数据区,Java VM从中为所有类实例和数组分配内存。堆可以是固定的或可变的大小。垃圾收集器是一个自动内存管理系统,可回收对象的堆内存。

    Eden Space:

    伊甸区,对象被创建的时候首先放到Eden Space,进行垃圾回收后,不能被回收的对象被放入到空的Survivor区域

    Survivor Space:

    幸存者区,用于保存在eden space内存区域中经过垃圾回收后没有被回收的对象

    Survivor Space分为两个空间大小一样的区域,分别是To Survivor和From Survivor,并且始终保持一个Survivor是空的

    Eden Space和Survivor Space都属于新生代

    对新生代 进行垃圾回收被称为Minor GC(或Young GC),每一次Minor GC后留下来的对象age(就是用来判断对象是否进入老年的标志)加1

    Old Gen:

    老年代,用于存放新生代中经过多次垃圾回收仍然存活的对象,也有可能是新生代分配不了内存的大对象会直接进入老年代。

    经过多次垃圾回收都没有被回收的对象,这些对象的age已经足够old了,就会放入到老年代。

    当老年代被放满之后,虚拟机会进行垃圾回收,称之为Major GC。由于Major GC除并发GC外均需对整个堆进行扫描和回收,因此又称为Full GC

    默认的,新生代 ( Young ) 与老年代 ( Old ) 的比例的值为 1:2 ( 该值可以通过参数 –XX:NewRatio 来指定 ),即:新生代 ( Young ) = 1/3 的堆空间大小。

    查看程序中线程的情况

    如果上面的“内存”页签相当于可视化的jstat命令的话,“线程”页签的功能相当于可视化的jstack命令,遇到线程停顿时可以使用这个页签进行监控分析。线程长时间停顿的主要原因主要有:等待外部资源(数据库连接、网络资源、设备资
    源等)、死循环、锁等待(活锁和死锁)

    单独查看程序中类的加载和卸载情况

    查看VM的概要情况以及相关运行参数

    显示了所有在platform. MBeanserver上注册的MBeans的信息

    Jconsole远程监控

    Web应用程序分析工具假设通过一个套接字进行连通性分析,只需要进行少许配置来设置 JConsole(或者是基于 JVMTI 的分析器,就这点而言),监控/分析远程运行的应用程序。

    JVM增加如下启动参数
    -Djava.rmi.server.hostname=外网ip地址
    -Dcom.sun.management.jmxremote
    -Dcom.sun.management.jmxremote.local.only=false
    
    • 1
    • 2
    • 3
    配置权限文件

    如果连接需要帐号和密码的话,加上这一步配置。

    [root@localhost management]# pwd
    /usr/local/src/jdk1.8.0_131/jre/lib/management
    [root@localhost management]# ls
    jmxremote.access  jmxremote.password  jmxremote.password.template  management.properties  snmp.acl.template
    [root@localhost management]# cp jmxremote.password.template jmxremote.password
    [root@localhost management]# vim jmxremote.password
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    对于jmxremote.password,将其中的:

    #monitorRole  QED
    #controlRole   R&D
    
    • 1
    • 2

    井号注释取消掉。其中monitorRole为只拥有只读权限的角色,controlRole有更高权限:读写等等。当然,也可以设置自己个性化的帐号密码。

    然后配置权限文件为600

    [root@localhost management]# chmod 600 jmxremote.password jmxremote.access
    
    • 1

    3)加入参数

    -D com.sun.management.jmxremote.pwd.file=/usr/local/src/jdk1.8.0_131/jre/lib/management/jmxremote.password"
    
    • 1

    并修改下面的配置为true

    -Dcom.sun.management.jmxremote.authenticate=true
    
    • 1

    连接失败的问题

    • 1)关闭防火墙
    • 2)hostname的问题:请将127.0.0.1修改为本地真实的IP(这个问题我没有遇到)
    [root@localhost management]# vim /etc/hosts
    
    192.168.1.12 localhost localhost.localdomain localhost4 localhost4.localdomain4
    ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
    
    • 1
    • 2
    • 3
    • 4
  • 相关阅读:
    【JS面试题】面试官:“[1,2,3].map(parseInt)“ 输出结果是什么?答上来就算你通过面试
    虚幻C+++基础 day2
    【Unity之UI编程】编写一个面板交互界面需要注意的细节
    SwiftUI 4 新功能大全之 Toggle与 Mixed Toggle 多个绑定组件
    ZCMU--1415: Box of Bricks(C语言)
    Electron常见问题 64 - Electron的升级安装包会下载到本地哪个目录?
    库克“一语成谶”:又有 30 万台安卓设备被“感染”了
    python利用matplotlib画实验图
    SpringCloudAlibaba基础实战(Dubbo+Nacos 服务注册与发现篇)
    【附源码】计算机毕业设计java长途汽车订票系统设计与实现
  • 原文地址:https://blog.csdn.net/l569590478/article/details/127716810