第三章 虚拟机性能监控与故障处理工具

简介: 一前言二虚拟机性能监控1JPS虚拟机进程状况工具2jstat虚拟机统计信息监视工具3jinfoJava配置信息工具4jmapJava内存映像工具5jhat虚拟机堆存储...

一、前言

除开java与javac,你还知道JDK的其他命名吗?
虚拟机故障处理与调优一般怎么处理?
JDK强大而且小巧的工具,可以帮助我们实现很多骚操作,如果线上服务器你实在难以近身,还提供了tools.jar的类库以备你在应用程序中实现强大监控功能,让你骚起来。同时帮你解决一些虚拟机故障。

二、虚拟机性能监控

ycyMac的JDKbin目录


2.1JPS:虚拟机进程状况工具

jps命令:jps [options] [hostid]

选项 作用
-q 只输出LIMID,省略主类的名称
-m 输出虚拟机进程启动时候传递给main()函数的参数
-l 输出主类的全名,如果进程执行的Jar包,输出的Jar路径
-v 输出虚拟机进程启动时候的参数

示例如下:

ycydeMacBook-Pro:~ ycy$ jps -l
96506 org.jetbrains.jps.cmdline.Launcher
96509 sun.tools.jps.Jps
ycydeMacBook-Pro:~ ycy$ 

2.2jstat:虚拟机统计信息监视工具

它显示进程汇总的类加载、内存、垃圾收集、JIT等数据。

jstat命令格式:jstat [option vmid ] [interval [s|ms] [count]]

选项 作用
-class 监视类装载、卸载数量、总空间以及类装载所消耗的时间
-gc 监视Java堆状况、包括Eden区、两个Survivor区、老年代、永久带等 容量等信息
-gccapacity 监视信息与gc相同,关注各个区域使用的最大、最小空间
-gcuti 监视信息与gc相同,关注使用空间占总空间的百分比
-gcnew 监视新生代GC情况
-gcnewcapacity 与gcnew相同,关注使用最大、最小空间
-gcold 监视老年代GC情况
-gcoldcapacity 关注使用最大、最小空间
-gcpermcapatity 输出永久代最大、最小空间
-compiler 输出JIT编译过的方法、耗时
-printcompilation 输出已经被JIT编译过的方法

实例如下

ycydeMacBook-Pro:~ ycy$ jps -l
96506 org.jetbrains.jps.cmdline.Launcher
96988 sun.tools.jps.Jps
ycydeMacBook-Pro:~ ycy$ jstat -gcutil 96506
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT   
  0.00  47.75  50.90   0.05  96.69  90.64      1    0.006     0    0.000    0.006
ycydeMacBook-Pro:~ ycy$ 

2.3jinfo:Java配置信息工具

实时查询虚拟机参数

jinfo命令格式:jinfo [options] pid

ycydeMacBook-Pro:~ ycy$ jinfo 96506
Attaching to process ID 96506, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.71-b15
Java System Properties:

os.name = Mac OS X
java.vm.specification.vendor = Oracle Corporation
java.runtime.version = 1.8.0_71-b15
·····

2.4jmap:Java内存映像工具

查询finalize执行队列、Java堆和永久代信息,使用哪种收集器等。

选项 作用
-dump 生成存储快照 格式:-dump [live,] format=b,file=,其中live说明是否只是dump存活的对象
-finalizerinfo 线上F-Queue在县城执行finalize方法对象
-heap 显示使用回收器、参数配置,分代情况
-histo 显示堆中统计信息,包括类、实例数量、合计内容
-permstat 以ClassLoader为统计口径显示永久代状态 1.8无
ycydeMacBook-Pro:~ ycy$ jps -l
97077 sun.tools.jps.Jps
96506 org.jetbrains.jps.cmdline.Launcher
ycydeMacBook-Pro:~ ycy$ jmap -heap 96506
Attaching to process ID 96506, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.71-b15

using thread-local object allocation.
Parallel GC with 8 thread(s)

Heap Configuration:
   MinHeapFreeRatio         = 0
   MaxHeapFreeRatio         = 100
   MaxHeapSize              = 734003200 (700.0MB)
   NewSize                  = 89128960 (85.0MB)
   MaxNewSize               = 244318208 (233.0MB)
   OldSize                  = 179306496 (171.0MB)
   NewRatio                 = 2
   SurvivorRatio            = 8
   MetaspaceSize            = 21807104 (20.796875MB)
   CompressedClassSpaceSize = 1073741824 (1024.0MB)
   MaxMetaspaceSize         = 17592186044415 MB
   G1HeapRegionSize         = 0 (0.0MB)

2.5jhat:虚拟机堆存储分析工具

生成http页面,我们后续使用其他工具分析,因为在服务器上面生成一个类型http://localhost:7000的分析页面比较不切合实际。

2.6jstack:Java堆栈跟踪工具

生成此时此刻的线程快照,为了定位线程长时间停顿原因、线程死锁、死循环、请求外部资源等待导致的长时间停顿的原因。

jstack命名格式:jstack [options] vmid

选项 作用
-F 当正常的请求不被响应时候,强制输出线程堆栈
-I 显示关于锁的附加信息
-m 如果调用的是c,可以打印c/c++堆栈

实际用法:我们在调用线程的时候,有一个getAllstackTraces()方法,可以一样输出StackTraceElement对象。

2.7JDK可视化工具

2.7.1JConsole:Java监视与管理控制台


package com.ycy.java.jconsole;

import java.util.ArrayList;
import java.util.List;

/**
 * @Copyright © 2017 . All rights reserved. Created with IntelliJ IDEA.
 * @project: untitled
 * @Package: com.ycy.java.jconsole
 * @Description: -Xms100M -Xmx100M
 * @autho: ycy
 * @Date: 2017-11-01
 * @Time: 23:22
 */
public class OOMObject {
    public byte[] placeholder=new byte[64*1024];

    public static void fillHeal(int num) throws InterruptedException {
        List<OOMObject> list=new ArrayList<>();
        for (int i=0;i<num;i++) {
            //延迟设置
            Thread.sleep(50);
            list.add(new OOMObject());
        }
    }

    public static void main(String[] args) throws InterruptedException {
        fillHeal(1000);
        System.gc();
        System.out.println(1);
    }
}

结果:
这里写图片描述

2.7.2 死锁实例

/**
     * 线程死循环演示
     */
    public static void createBusyThread(){
        Thread thread=new Thread(new Runnable() {
            @Override
            public void run() {
                while (true){
                 //34行
                }
            }
        },"testBusyThread");
        thread.start();
    }

    static class SynAddRunable implements Runnable{
        Integer a,b;
        public SynAddRunable(Integer a,Integer b){
            this.a=a;
            this.b=b;
        }
        @Override
        public void run() {
            synchronized (a){
                synchronized (b){
                    System.out.println(a+b);
                }
            }
        }
    }
    public static void main(String[] args) throws InterruptedException {
        //#内存变化
//        fillHeal(1000);
//        System.gc();
//        System.out.println(1);
        //#线程死循环
//        createBusyThread();
        //死锁代码
        for (int i = 0; i <100 ; i++) {
            new Thread(new SynAddRunable(1,2)).start();
            new Thread(new SynAddRunable(2,1)).start();
        }
    }

结果
这里写图片描述

目录
相关文章
|
18天前
|
存储 虚拟化
使用DiskGenius工具来实现物理机迁移虚拟机,实现虚拟化
【9月更文挑战第1天】使用 DiskGenius 工具可将物理机迁移到虚拟机,实现系统与数据的虚拟化。此过程包括:安装 DiskGenius 和准备虚拟化平台;备份物理机数据;使用 DiskGenius 备份磁盘;在虚拟化软件中创建新虚拟机并导入磁盘备份;配置及调整虚拟机设置;测试性能并优化资源分配。这有助于测试、开发及系统管理。
|
21天前
|
监控 Java 开发者
揭秘Struts 2性能监控:选对工具与方法,让你的应用跑得更快,赢在起跑线上!
【8月更文挑战第31天】在企业级应用开发中,性能监控对系统的稳定运行至关重要。针对流行的Java EE框架Struts 2,本文探讨了性能监控的工具与方法,包括商用的JProfiler、免费的VisualVM以及Struts 2自带的性能监控插件。通过示例代码展示了如何在实际项目中实施这些监控手段,帮助开发者发现和解决性能瓶颈,确保应用在高并发、高负载环境下稳定运行。选择合适的监控工具需综合考虑项目需求、成本、易用性和可扩展性等因素。
28 0
|
21天前
|
Java 开发者 前端开发
Struts 2、Spring MVC、Play Framework 上演巅峰之战,Web 开发的未来何去何从?
【8月更文挑战第31天】在Web应用开发中,Struts 2框架因强大功能和灵活配置备受青睐,但开发者常遇配置错误、类型转换失败、标签属性设置不当及异常处理等问题。本文通过实例解析常见难题与解决方案,如配置文件中遗漏`result`元素致页面跳转失败、日期格式不匹配需自定义转换器、`&lt;s:checkbox&gt;`标签缺少`label`属性致显示不全及Action中未捕获异常影响用户体验等,助您有效应对挑战。
44 0
|
21天前
|
SQL 监控 关系型数据库
SQL性能监控与调优工具的神奇之处:如何用最佳实践选择最适合你的那一个,让你的数据库飞起来?
【8月更文挑战第31天】在现代软件开发中,数据库性能监控与调优对应用稳定性至关重要。本文对比了数据库内置工具、第三方工具及云服务工具等几种常用SQL性能监控与调优工具,并通过示例代码展示了如何利用MySQL的EXPLAIN功能分析查询性能。选择最适合的工具需综合考虑功能需求、数据库类型及成本预算等因素。遵循了解工具功能、试用工具及定期维护工具等最佳实践,可帮助开发者更高效地管理和优化数据库性能,迎接未来软件开发中的挑战与机遇。
21 0
|
2月前
|
运维 监控 Java
(十)JVM成神路之线上故障排查、性能监控工具分析及各线上问题排错实战
经过前述九章的JVM知识学习后,咱们对于JVM的整体知识体系已经有了全面的认知。但前面的章节中,更多的是停留在理论上进行阐述,而本章节中则更多的会分析JVM的实战操作。
|
1月前
|
存储 监控 Ubuntu
完全交互式!易于使用的 Linux 性能监控工具
完全交互式!易于使用的 Linux 性能监控工具
|
2月前
|
监控 算法 Java
深入探索Java虚拟机:性能监控与调优实践
在面对日益复杂的企业级应用时,Java虚拟机(JVM)的性能监控和调优显得尤为重要。本文将深入探讨JVM的内部机制,分析常见的性能瓶颈,并提供一系列针对性的调优策略。通过实际案例分析,我们将展示如何运用现代工具对JVM进行监控、诊断及优化,以提升Java应用的性能和稳定性。
|
3月前
|
Unix Linux 虚拟化
虚拟机VMware知识积累
虚拟机VMware知识积累
|
8天前
|
存储 SQL 数据挖掘
虚拟化数据恢复—VMware虚拟机vmdk文件被误删除的数据恢复案例
虚拟化数据恢复环境: 某品牌服务器(部署VMware EXSI虚拟机)+同品牌存储(存放虚拟机文件)。 虚拟化故障: 意外断电导致服务器上某台虚拟机无法正常启动。查看虚拟机配置文件发现这台故障虚拟机除了磁盘文件以外其他配置文件全部丢失,xxx-flat.vmdk磁盘文件和xxx-000001-delta.vmdk快照文件还在。管理员联系VMware工程师寻求帮助。VMware工程师尝试新建一个虚拟机来解决故障,但发现ESXi存储空间不足。于是将故障虚拟机下的xxx-flat.vmdk磁盘文件删除,然后重建一个虚拟机并且分配固定大小的虚拟磁盘。
|
30天前
|
测试技术 Linux 虚拟化
iOS自动化测试方案(五):保姆级VMware虚拟机安装MacOS
详细的VMware虚拟机安装macOS Big Sur的保姆级教程,包括下载VMware和macOS镜像、图解安装步骤和遇到问题时的解决方案,旨在帮助读者顺利搭建macOS虚拟机环境。
46 3
iOS自动化测试方案(五):保姆级VMware虚拟机安装MacOS