一篇文章教你用Java使用JVM工具检测问题

目录
  • 1.jps
  • 2.jstat
  • 3.jinfo
  • 4.jstack
    • a.死循环案例
    • b.等待输入
    • c.死锁
  • 5.jconsole
  • 6.jvisualvm
  • 总结

1.jps

显示运行程序的进程、编码、主类目录信息

public class Demo01 {
    /**
     *  jps : 显示进程ID,主类名称
     *  jps -v: 显示进程ID,主类名称以及详细编码信息
     *  jps -l:显示进程ID,主类目录
     *
     * @param args
     * @throws IOException
     */
    public static void main(String[] args) throws IOException {
        System.out.println("jps");
        System.in.read();
    }
}

2.jstat

监视虛拟机各种运行状态信息,显示本地或者是远程虚拟机进程中的类装载内存、垃圾收集、编译等运行数据

public class Demo01 {
    /**
     * jstat -gc 18912 500 10 每隔500毫米打印10 次gc信息
     *
     * jstat -class 18912 监视JVM类装载、卸载数量,总空间、类装载所耗费时间
     *       Loaded:已加载class类的数量
     *       Bytes:加载的kb内存空间数
     *       Unloaded:卸载class类数量
     *       Bytes:卸载的kb内存空间数
     *       Time: 执行 类加载和卸载操作所花费的时
     *
     * jstat -compiler 18912 jvm编译类耗时操作
     *       Compiled:执行的编译任务次数
     *       Failed: 编译任务数失败
     *       Invalid: 无效的编译任务
     *       Time: 执行编译任务耗时
     *       FailedType: 编译失败的类型
     *       FailedMethod: 编译失败的类名 和 方法名
     * @param args
     * @throws IOException
     */
    public static void main(String[] args) throws IOException {
        System.out.println("jstat");
        System.in.read();
    }
}

关于堆区命名规范,c-结尾空间,u-被使用空间 , t-回收时间

package com.qfedu.fmmall.test;

import java.io.IOException;

public class Demo03 {
    // Xms20m -Xmx20m -Xmn10m -XX:+UseSerialGC -XX:+PrintGCDetails -verbose:gc

    /** jstat -gc 16944
     *
     * 空间容量(kb)
     * 幸存者0       幸存者0被使用         伊甸园     伊甸园被使用  老年代    老年代被使用   元空间  被使用  压缩类    使用压缩类
     *  S0C     S1C      S0U    S1U      EC       EU          OC       OU          MC     MU     CCSC     CCSU
     * 10752.0  10752.0  0.0    0.0   65024.0   9865.8   173568.0     0.0        4480.0  770.3    384.0    75.9
     *
    *  新生代垃圾回收数量   新生代垃圾回收时间                        总垃圾回收时间
     *       YGC            YGCT              FGC    FGCT      GCT
     *       0             0.000               0     0.000     0.000
     *
     * jstat -gcutil 16944 显示使用百分比
     *
     * gcutil 项:垃级饮集统计信
     * SO:幸存者空间 0利用率占该空间当前容量的分比
     * S1:幸存者空间 1利用率占空间当前容量的分比
     * E: Eden空间 利用率占空间当前容量的百分
     * 0: 老年代 利用率占空间当前容量的百分比
     * M: 元空间 利用率占空间当前容量的百分比
     * CCS: 压缩的类空间初用率以百分比
     * YGC:新生代GC事件的数量
     * YGCT:新生代垃级回收时问
     * FGC: 完整GC事件的数量
     * FGCT: 完整的拉级收集时问
     * GCT: 总拉扱收集时问
     *
     * @param args
     * @throws IOException
     */
    public static void main(String[] args) throws IOException {
        final int _1mb = 1024 * 1024;
        byte[] b1 = new byte[2 * _1mb];
        System.out.println("_1mb阻塞");
        System.in.read();

        byte[] b2 = new byte[2 * _1mb];
        System.out.println("_2mb阻塞");
        System.in.read();

        byte[] b3 = new byte[2 * _1mb];
        System.out.println("_3mb阻塞");
        System.in.read();
    }
}

3.jinfo

3516 打印jvm系统参数

4.jstack

检测程序中的问题

jstack -l 19224

package com.qfedu.fmmall.test;
import java.io.IOException;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Demo02 {
    public static void main(String[] args) throws IOException {
//        test1();
//        test2();
        test3();
    }

    // 死循环
    private static void test1() {
        while (true) {

        }
    }

    // 等待输入
    private static void test2() throws IOException {
        System.out.println("jstat");
        System.in.read();
    }

    public static void test3() {
        Lock lock1 = new ReentrantLock();
        Lock lock2 = new ReentrantLock();
        new Thread(() -> {
              try {
                  lock1.lock();
                  Thread.sleep(100);
                  lock2.lock();
              }catch (InterruptedException e) {
                  e.printStackTrace();
              }
        },"lock1").start();

        new Thread(() -> {
            try {
                lock2.lock();
                Thread.sleep(100);
                lock1.lock();
            }catch (InterruptedException e) {
                e.printStackTrace();
            }
        },"lock2").start();
    }
}

a.死循环案例

在liunx系统通过ps 根据进程 找到线程id,转换成转换成16进制。

死循环处于运行状态:RUNNABLE

b.等待输入

c.死锁

Found 1 deadlock. 发现一个死锁

5.jconsole

图形化监测程序的内存和线程变化等信息

死循环观察CPU很高

程序正常变化

检测死锁

6.jvisualvm

命令观察内存变化,还可以连接远程

堆内存变化

观察每个对象内存大小

每个线程CPU时间

检测到死锁

Liunx 用命令行多

详细介绍工具使用

版本是Java JDK1.8测试

真实项目体验,一开始启动测试

ed区内存300-400之间,JVM就自动执行了一次垃圾回收ed区,移到老年区

老年代是大对象连续存活的字符串,有没有那种可能,直接创建这种对象到老年代,避免内存复制和CPU开销,就像预编译一样,提前编译好等待被调用。

根据时间点看,GC回收一次ed区,大对象移到老年区,CPU飙升到百分之3,这得看机器CPU

总结

性能分析是通过收集程序运行时的执行数据来帮助开发人员定位程序需要被优化的部分,从而提高程序的运行速度或是内存使用效率,主要有以下三个方面CPU性能分析:

CPU性能分析

主要是统计函数的调用情况及执行时间,或者更简单的情況就是统计应用程序的CPU使用情况。通常有CPU监视和CPU快照两种方式来显示CPU性能分析結果.

内存性能分析

主要目的是通过统计内存使用情况检则可能存在的内存泄露问题及确定优化内存使用的方向。通常有内存监视和内存快照两种方式来量示内存性能分析结果。

线程性能分析

主要用于在多线程应用程序中确定内存的可题所在。一般包括线程的状态变化情况,死锁情和某个线程在线程生命期内状态的分布情况等

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • 教你如何使用Java输出各种形状

    目录 1.输出矩形 3.输出平行四边形 4.输出三角形 5.输出菱形 5.输出空心菱形 6.输出正方形 7.输出实心菱形 1.输出矩形 以此矩形案例(4行,9列的矩形)为例 public static void main(String[] args) { //输出矩形 for (int i = 1; i <= 4; i++) {//控制行,即4行 for (int j = 1; j <= 9; j++) {//控制输出的*的个数,每行9个 System.out.print("*&qu

  • Java 基于Spire.Cloud.SDK for Java在PDF中绘制形状

    Spire.Cloud.SDK for Java提供了pdfPathApi接口可用于在PDF文档中绘制形状(或图形),如绘制线条形状drawLine().绘制矩形形状drawRectanglef(),下面将介绍如何通过Java示例和步骤来实现: 一.导入jar文件.(有2种方式) 创建Maven项目程序,通过maven仓库下载导入.以IDEA为例,新建Maven项目,在pom.xml文件中配置maven仓库路径,并指定spire.cloud.sdk的依赖,如下: <repositories>

  • Java 在PDF中绘制形状的两种方法

    在我们编辑PDF文档的过程中,有时候需要在文档中添加一些如多边形.矩形.椭圆形之类的图形,而Free Spire PDF for Java 则正好可以帮助我们在Java程序中通过代码在PDF文档中绘制形状,以及设置形状边线颜色和填充色. Jar包导入 方法一:下载Free Spire.PDF for Java包并解压缩,然后将lib文件夹下的Spire.Pdf.jar包作为依赖项导入到Java应用程序中 方法二:直接通过Maven仓库安装JAR包,配置pom.xml文件的代码如下: <repos

  • Python 协程与 JavaScript 协程的对比

    目录 1.前言 2.什么是协程? 3.混乱的历史 3.1 Python 协程的进化 4.JavaScript 协程的进化 5.Python 协程成熟体 5.1 协程(coroutine) 5.2 任务(Task 对象) 5.3 未来对象(Future) 5.4几种事件循环(event loop) 6.JavaScript 协程成熟体 6.1Promise 继续使用 6.2 async.await语法糖 6.3 js 异步执行的运行机制 6.4 event loop 将任务划分 7.总结与对比 1

  • 一篇文章教你用Java使用JVM工具检测问题

    目录 1.jps 2.jstat 3.jinfo 4.jstack a.死循环案例 b.等待输入 c.死锁 5.jconsole 6.jvisualvm 总结 1.jps 显示运行程序的进程.编码.主类目录信息 public class Demo01 { /** * jps : 显示进程ID,主类名称 * jps -v: 显示进程ID,主类名称以及详细编码信息 * jps -l:显示进程ID,主类目录 * * @param args * @throws IOException */ public

  • 一篇文章教你将JAVA的RabbitMQz与SpringBoot整合

    目录 一.fanout:发布订阅型 二.direct:直连型 三.topic:通配符模式 四.消费者端接收消息 总结 本文主要聊SpringBoot整合RabbitMQ,主要分为生产者和消费者两个工程,目录结构如下: 先简单说一下RabbitMQ的一些核心概念: 1.虚拟主机vhost:vhost是物理隔离的,你可以将vhost看作是一个个小型的RabbitMQ 2.交换机exchange:生产者发送的消息不是直接到达队列的,而是交换机,然后交换机再根据路由key,路由到指定的队列,可以理解为一

  • 一篇文章教你使用SpringBoot如何实现定时任务

    前言 在 Spring + SpringMVC 环境中,一般来说,要实现定时任务,我们有两中方案,一种是使用 Spring 自带的定时任务处理器 @Scheduled 注解,另一种就是使用第三方框架 Quartz ,Spring Boot 源自 Spring+SpringMVC ,因此天然具备这两个 Spring 中的定时任务实现策略,当然也支持 Quartz,本文我们就来看下 Spring Boot 中两种定时任务的实现方式. 一.第一种方式:@Scheduled 使用 @Scheduled

  • 一篇文章教你学会js实现弹幕效果

    目录 新建一个html文件: 建好html文件,搞出初始模版 HTML添加 CSS填充 js逻辑代码 动画效果 下面是弹幕效果 : 相信小伙伴们都看过了,那么它实现的原理是什么呢,那么我们前端怎么用我们web技术去实现呢?? 新建一个html文件: 哈哈哈,大家别像我一样用中文命名. 中文命名是不合规范的,行走江湖,大佬们看见你的中文命名会笑话你的. 上图中,我们引入了jquery插件,没错我们用jq写,回归原始(找不到cdn链接的小伙伴可以百度bootcdn,在里面搜索jquery).并且取了

  • 一篇文章带你了解Java Spring基础与IOC

    目录 About Spring About IOC Hello Spring Hello.java Beans.xml Test.java IOC创建对象的几种方式 Spring import settings Dependency Injection 1.构造器注入 2.set注入 3.拓展注入 P-namespcae&C-namespace Bean scopes singleton prototype Bean的自动装配 byName autowire byType autowire 小结

  • 一篇文章教你学会使用Python绘制甘特图

    目录 优点 局限 一日一书 用来制作甘特图的专业工具也不少,常见的有:Microsoft Office Project.GanttProject.WARCHART XGantt.jQuery.Gantt.Excel等,网络上也有一些优质工具支持在线绘制甘特图. 可是这种现成的工具,往往也存在一些弊端,让编程人员不知所措.比如说,花里胡哨的UI,让人目不暇接,不知点哪个才好: 比如说,有些基于浏览器的图表需要掌握HTML.JS等编程语言,只会点Python的我直接被劝退: 再比如,进来就是注册.登

  • 一篇文章教会你使用java爬取想要的资源

    目录 说明 方法摘要 常用的Element节点方法 实战:爬取B站番剧 Maven 代码 说明 简介: 你还在为想要的资源而获取不到而烦劳吗?你还在为你不会python而爬取不到资源而烦劳吗?没关系,看完我这一篇文章你就会学会用java爬取资源,从此不会因此而烦劳,下面我会以爬取京东物品来进行实战演示!!! 方法摘要 方法 方法说明 adoptNode(Node source) 试图把另一文档中的节点采用到此文档. createAttribute(String name) 创建指定名称的Attr

  • 一篇文章轻松搞懂Java中的自旋锁

    前言 锁作为并发共享数据,保证一致性的工具,在JAVA平台有多种实现(如 synchronized 和 ReentrantLock等等 ) .这些已经写好提供的锁为我们开发提供了便利. 在之前的文章<一文彻底搞懂面试中常问的各种"锁" >中介绍了Java中的各种"锁",可能对于不是很了解这些概念的同学来说会觉得有点绕,所以我决定拆分出来,逐步详细的介绍一下这些锁的来龙去脉,那么这篇文章就先来会一会"自旋锁". 正文 出现原因 在我们的

  • 一篇文章带你了解Java中ThreadPool线程池

    目录 ThreadPool 线程池的优势 线程池的特点 1 线程池的方法 (1) newFixedThreadPool (2) newSingleThreadExecutor (3) newScheduledThreadPool (4) newCachedThreadPool 2 线程池底层原理 3 线程池策略及分析 拒绝策略 如何设置maximumPoolSize大小 ThreadPool 线程池的优势 线程池做的工作主要是控制运行的线程数量,处理过程中将任务放入队列,然后在线程创建后启动这些

  • 一篇文章带你复习java知识点

    JDK JRE JVM JDK: Java标准开发包,它提供了编译.运⾏Java程序所需的各种⼯具和资源,包括Java编译器.Java运⾏时环境,以及常⽤的Java类库等. JRE: Java运⾏环境,⽤于解释执⾏Java的字节码⽂件. JVM Java虚拟机,是JRE的⼀部分.负责解释执⾏字节码⽂件,是可运⾏java字节码⽂件的虚拟计算机 区别联系:(问答题会考可能) JDK包含JRE,JDK 和 JRE 中都包含 JVM.JDK出了包含jre还包含⼀些常⽤开发⼯具和基础类库 JDK ⽤于开发

随机推荐