美文网首页
JProfiler使用补充

JProfiler使用补充

作者: 乙腾 | 来源:发表于2021-06-14 19:40 被阅读0次

    JProfiler功能介绍

    telemetries(遥感监测)

    image.png

    Overview

    整体的一个视图,下面几个菜单的一个整合。


    image.png

    Memory

    内存


    image.png

    Memory pool

    可以选择查看具体的结构


    image.png

    点击RunGC


    image.png

    GC Activity

    垃圾回收器的活跃行为


    image.png

    Classes

    内存中加载类的个数


    image.png

    Threads

    image.png

    CPU Load

    cpu 加载 程序运行的时候cpu的使用情况


    image.png

    Live memory

    内存视图分析

    All Objects

    image.png
    这里的实例大小不包括引用对象的size。
    通过All Objects可以分析的点
    1.频繁创建的Java对象:死循环,循环次数过多。(这点结合mark current来看更明显)
    现象:实例多,size大。
    2.存在大的对象:读取文件的时候,byte[]应该边读边写。如果长时间不写出的话,导致byte[] 过大。如果发现
    现象:size大,但是对象少。
    3.内存泄漏,长时间不被回收。

    Mark Current

    基于某一个时间后内存直方图的变化


    image.png

    Packages

    以包的形式展示


    image.png

    Recorded Objcets

    开启记录,对程序性能会有一定的影响,一般在发生内存泄漏的时候使用。
    记录对象变化。

    image.png
    进行筛选
    image.png
    Live Objects 活跃的类
    Gabage Collected Ojects 垃圾回收的类,显示此次被垃圾回收的类
    Live & Gabage 两者皆有
    Run Gc后 选择 Gabage Collected Ojects
    image.png
    如果运行一次Gc后发现对象没有被完全回收,那么就可以怀疑其发生内存泄漏。
    image.png
    GC后除picture,其他两个对象都是从0开始增加,但是picture不是从零开始,或者GC对其根本没有影响,可以合理怀疑其是否发生了内存泄露。
    notice:
    内存泄漏
    image.png
    每次gc后内存稳步提升,可以怀疑有内存泄露的问题。

    Heap Walker

    观察对象堆内存

    对象跟踪

    image.png
    image.png

    Outgoin references 引用其他
    Incoming references 被引用


    image.png
    image.png

    incoming谁指向当前类


    image.png
    定位到到底那个类那个方法引用的
    用图表的方式展现
    image.png
    image.png
    查找Object的 GC Root
    image.png
    image.png

    层层向前找


    image.png

    生成堆的转储文件

    image.png
    image.png

    生成转储文件,用于离线分析。


    image.png

    例子:

    jmap -dump:live,format=b,file=order1.hprof 19570
    生成hprof文件,通过jprofiler打开


    image.png

    查看被谁引用


    image.png
    image.png
    可以看见引用他的线程
    也可以选择在直方图中展示
    image.png

    找到引用他的线程


    image.png
    找业务代码还有一个窍门,看线程名字,像这种Thread-7一看就是业务线程或者一些业务自定义线程。

    CPU views

    Call Tree

    访问树


    image.png

    通常一个方法执行执行时间和CPU占用空间成正比。

    查看所有线程
    image.png
    查看状态
    image.png

    选择查看的维度(方法,类,包)


    image.png

    如果类比较多,则可以选择通过packages查看。

    视图说明

    image.png

    Method Statistcs

    方法统计,展示比较耗费cpu的方法


    image.png

    Threads

    Thread History

    image.png

    当前所有线程。
    Net I/O 表示:网络请求。

    补充

    线程分析主要看三个方面:

    1.web容器的线程最大数。比如:Tomcat的县城容量应该略大于最大并发数。
    2.线程阻塞。
    3.线程死锁。

    阻塞线程

    image.png

    这种长期红色的线程,都是有阻塞现象的。

    例子

    内存泄漏

    package com.study.prometheus.test;
    
    import java.util.ArrayList;
    import java.util.concurrent.TimeUnit;
    
    /**
     * <p>
     *
     * @Description: 内存泄露
     * </p>
     * @ClassName Test
     * @Author pl
     * @Date 2021/6/8
     * @Version V1.0.0
     */
    public class MemoryLeak {
    
        public static void main(String[] args) {
            while (true) {
                ArrayList beanList = new ArrayList();
                for (int i = 0; i < 500; i++) {
                    Bean data = new Bean();
                    data.list.add(new byte[1024 * 10]);//10kb
                    beanList.add(data);
                }
                try {
                    TimeUnit.MILLISECONDS.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    
    }
    
    class Bean {
        int size = 10;
        String info = "hello,111";
        static ArrayList list = new ArrayList();
    }
    
    
    image.png

    内存消耗持续增加。


    image.png

    发现byte[]消耗的最多


    image.png
    记录关键对象
    选择byte[] show selection in heap walker
    image.png
    image.png

    层层点击


    image.png
    发现是在
    com.study.prometheus.test
    

    中引用。
    选中byte[] 显示直方图


    image.png

    选择show paths to GC Root


    image.png
    image.png
    查看到这个调用链,是在MemoryLeak中调用

    相关文章

      网友评论

          本文标题:JProfiler使用补充

          本文链接:https://www.haomeiwen.com/subject/rpmoeltx.html