JProfiler功能介绍
telemetries(遥感监测)
image.pngOverview
整体的一个视图,下面几个菜单的一个整合。
image.png
Memory
内存
image.png
Memory pool
可以选择查看具体的结构
image.png
点击RunGC
image.png
GC Activity
垃圾回收器的活跃行为
image.png
Classes
内存中加载类的个数
image.png
Threads
image.pngCPU 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
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.pngimage.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.pngimage.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.pngMethod 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中调用
网友评论