Menu

  • Home
  • Work
    • Cloud
      • Virtualization
      • IaaS
      • PaaS
    • Java
    • Go
    • C
    • C++
    • JavaScript
    • PHP
    • Python
    • Architecture
    • Others
      • Assembly
      • Ruby
      • Perl
      • Lua
      • Rust
      • XML
      • Network
      • IoT
      • GIS
      • AI
      • Math
      • RE
      • Graphic
    • OS
      • Linux
      • Windows
      • Mac OS X
    • BigData
    • Database
      • MySQL
      • Oracle
    • Mobile
      • Android
      • IOS
    • Web
      • HTML
      • CSS
  • Life
    • Cooking
    • Travel
    • Gardening
  • Gallery
  • Video
  • Music
  • Essay
  • Home
  • Work
    • Cloud
      • Virtualization
      • IaaS
      • PaaS
    • Java
    • Go
    • C
    • C++
    • JavaScript
    • PHP
    • Python
    • Architecture
    • Others
      • Assembly
      • Ruby
      • Perl
      • Lua
      • Rust
      • XML
      • Network
      • IoT
      • GIS
      • AI
      • Math
      • RE
      • Graphic
    • OS
      • Linux
      • Windows
      • Mac OS X
    • BigData
    • Database
      • MySQL
      • Oracle
    • Mobile
      • Android
      • IOS
    • Web
      • HTML
      • CSS
  • Life
    • Cooking
    • Travel
    • Gardening
  • Gallery
  • Video
  • Music
  • Essay

JProfiler学习笔记

22
Mar
2010

JProfiler学习笔记

By Alex
/ in Java
/ tags JVM, 学习笔记, 性能剖析
0 Comments
剖析视图
内存视图(Memory Views)

该视图专注于对象的内存分配情况,包含以下选项卡:

 All Objects 显示堆中实时的对象情况:显示某种类型(聚合级别可以是类、包等)对象的数量(Instance Count)、浅尺寸(Shallow size)关于浅尺寸的计算:

  1. 普通对象大小的计算不包括引用、类变量,由变量本身地址、基本类型的变量占用的内存等组成
  2. 数组整体计算,不分为单个元素计算大小/数量

注意,有些对象虽然没有引用,但是可能没被GC回收,可以手工Run GC

右击某一类型,可以转到Class Tracker或者Heaper Walker视图

Recorded Objects 显示已经进行记录的对象。与All Objects相比,可以查看对象分配调用树(Allocation Call Tree)、分配热点(Allocation Hot Sports)点击工具栏:Start Memory,可以录制对象分配
Allocation Call Tree 显示选中的、已录制对象类型的分配调用数,分析调用栈的哪些栈帧比较消耗资源。从线程执行开始处,一直追溯到对象被创建的地方,对象占用内存的大小被显示,效果如下图:
Allocation Hot Sports 显示选中的、已录制对象类型的分配热点:以创建对象的方法为根显示调用树,效果如下图:alloc-hotsopt
Class Tracker  显示选中类型对象的实例个数的曲线图(按时间)
堆遍历(Heap Walker)

该视图用于静态分析堆快照,在生成快照之前,会进行一次Full GC。包含以下选项卡:

Classes 类似于Memory Views的All Objects,可以显示快照中所有对象的数量、大小。右击选择Use Selected Instances,则可以显示单种类型的数据
Allocations 分析对象分配情况:包括4种显示方式:Cumulated Allocation Tree:累积调用树,显示对象分配调用树,包含对象sizeAllocation Tree:调用树,显示对象分配调用树,包含对象sizeAllocation Tree Map:以Tree Map形式显示调用树Allocation Hot spots:显示分配对象最多的方法
Biggest Objects 显示占用内存最多的对象
References 显示单种类型的引用情况包含4种显示方式:Incoming references:其它对象对每一个选中对象的引用Outcoming references:每一个选中对象对其它对象的引用Cumulated Incoming references:显示其它对象、字段对选中对象类型的总体引用统计Cumulated Outcoming references:显示选中对象类型对其它对象、字段的总体引用统计
Time 分析对象分配的消耗时间
Inspections 提供多种精细的对象分配分析方式
Graph 图形化方式显示对象的引用图
CPU视图(CPU Views)

该视图用于分析方法的CPU占用时间,包括以下选项卡:

 Call Tree 显示自顶而下的调用堆栈的树,树的根是线程开始处,树的分叉表示的不同的调用路径。暗红色显示当前节点及其子节点消耗的时间、高亮红色显示本级节点消耗的时间。

显示未过滤类对过滤类的直接调用,不显示深入的调用,在被过滤类的左上角显示红三角。main方法、线程的run方法总是显示,不予过滤。
通过Profiling Settings可以选择CPU时间的度量方式:Elapsed time/Estimated CPU time,前者为Wall clock time(物理世界真实时间),后者为占用CPU的时间。由于操作系统的固有限制,10ms以下的时间可能不具有统计学意义。
界面右上角的Thread Status用于选择参与分析的线程状态,通常选择Runnable来分析性能问题,有时可以结合Net I/O、Blocked
工具栏Start Tracking,可以追踪某些任务在不同线程之间的传递(调用点/执行点Call site/Execution site)

效果如下图:
call-tree

 Hot Spots 显示耗时最高的方法调用,显示消耗时间、平均消耗时间、调用次数等字段,以耗时方法为根,可以追溯到线程启动处Filtered Classes设置:选择被过滤类占用时间,可以单独列出,或者算在调用它的元素上(main、线程run不能过滤)
每个方法可能被多个调用栈调用,百分比显示不同调用栈对此方法的固有时间的“贡献”
不显示Total time,只显示Inherent Time
Call Graph 显示方法调用的序列,包括某个方法的调用与被调用情况
Method Stat 点击工具栏图标,可以录制方法的统计信息并进行分析
Call Tracer 点击工具栏图标,可以对方法调用进行跟踪
线程视图(Thread Views)

该视图用于分析线程的状态和历史分析、检测死锁,并可以获取线程快照,包含以下选项卡:

Thread History 线程状态时间线,可以选择显示活着的或者死去的线程

绿色:Runnable:表示线程可以接受CPU调度,但不一定正在占用CPU,和线程优先级、调度算法、系统负载有关
黄色:Waiting:表示线程正在睡眠(java.lang.Thread.Sleep),或者在监视器上等待(java.lang.Object.wait),前者不会放弃占有的监视器
红色:Blocked:表示线程被阻塞,正在积极尝试进入同步区
浅蓝色:Net I/O:线程正在等待网络操作的完成,监听Socket或者读写Socket时产生此状态
效果图如下:
thread-history
Thread Monitor 显示线程的开始结束时间、父线程、状态等信息
Thread Dumps 获取线程快照,可以分析瞬时系统各线程的调用栈
监视器视图(Monitor Views)

该视图用于锁状态检测,包含以下选项卡:

 Current Locking Graph 当前锁状态图,显示监视器、以及在监视器上等待的线程。

黑色箭头表示当前拥有此监视器的线程

红色虚线表示被阻塞的线程(积极尝试获得锁)

黄色箭头表示在监视器上等待的线程(java.lang.Object.wait)

效果图如下:

current-monitor

Current Monitors 显示当前活动的监视器,包括监视器状态、监视器类、等待线程、拥有者线程等信息
Locking History Graph 可以录制监视器锁定的历史
Monitor History 可以显示所有监视器的历史
Monitor Usage Stat 以监视器、线程等方式分组,显示监视器的使用统计,包括阻塞次数、阻塞持续时间、等待次数、等待持续时间等
虚拟机遥感视图(VM Telemetry Views)

该视图可以显示时间线上的系统宏观信息,包括以下选项卡:

Memory 显示已有、空闲内存的区域图
Recorded Objects 显示堆中对象(数组、非数组)的数量
Recorded Throughput 显示已记录对象的创建和销毁数量
GC Activity 显示GC活动率百分比
Classes 显示加载的类的数量
Threads 显示处于各种状态的线程的数量
CPU Load 显示CPU负载百分比
JavaEE以及探针(JEE & Probes)

可以使用多种探针来检测不同的应用领域,包括:JDBC、JPA/Hibernate、JNDI、JMS、Servlet、RMI、Socket、WebServices、Files等。

剖析配置
触发器

用于在特定条件下触发剖析动作
触发条件:方法被调用、堆使用阈值、CPU使用率阈值、内存溢出异常、定时器、虚拟机启动、虚拟机关闭等
剖析动作:启/停录制、调用跟踪、监视器跟踪,触发堆dump、线程dump,启/停探针录制,保存快照,保存HPROF快照,运行脚本等

离线剖析

使用场景:脚本启动剖析、定期快照保存、剖析远程服务器

Session ID:需要指定id=xxx参数来激活相应的Profiling Settings,此ID显示在Session Settings - Application Settings的左上角,如果配置文件中只包含一个Session,则不需要配置。
配置文件位置:可以指定config=xxx.xml,来指明设置的存放位置,默认是~/.jprofiler7/config.xml
离线剖析命令行样例:
Shell
1
2
3
4
java
"-agentpath:D:\JavaEE\jprofiler\7.2.2\bin\windows-x64\jprofilerti.dll=offline,id=109,config=D:\JavaEE\Config\jprofiler-offline.xml"
"-Xbootclasspath/a:D:\JavaEE\jprofiler\7.2.2\\bin\agent.jar"
-classpath myapp.jar cc.gmem.demo.MyApp

 

分享这篇文章到:
← 原型模式
Eclipse知识集锦 →

Leave a Reply Cancel reply

您可以使用以下网站的账户登录:

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

Related Posts

  • 使用Eclipse Memory Analyzer分析JVM堆Dump
  • 使用Oracle Java Mission Control监控JVM运行状态
  • JVM参数与性能调优
  • 使用Sysdig进行系统性能分析
  • Go应用性能剖析

Recent Posts

  • 记录一次KeyDB缓慢的定位过程
  • IPVS模式下ClusterIP泄露宿主机端口的问题
  • 念爷爷
  • 杨梅坑
  • 34759
ABOUT ME

汪震 | Alex Wong

江苏淮安人,现居北京,热爱软件技术,努力成为一名优秀的全栈工程师。

GitHub:gmemcc

Git:git.gmem.cc

Email:gmemjunk@gmem.cc@me.com

ABOUT GMEM

绿色记忆是我的个人网站,域名gmem.cc中G是Green的简写,MEM是Memory的简写,CC则是我的小天使彩彩名字的简写。

我在这里记录自己的工作与生活,同时和大家分享一些编程方面的知识。

GMEM HISTORY
v2.00:微风
v1.03:单车旅行
v1.02:夏日版
v1.01:未完成
v0.10:彩虹天堂
v0.01:阳光海岸
MIRROR INFO
Meta
  • Log in
  • Entries RSS
  • Comments RSS
  • WordPress.org
Recent Posts
  • 记录一次KeyDB缓慢的定位过程
    环境说明 运行环境 这个问题出现在一套搭建在虚拟机上的Kubernetes 1.18集群上。集群有三个节点: ...
  • IPVS模式下ClusterIP泄露宿主机端口的问题
    问题 在一个启用了IPVS模式kube-proxy的K8S集群中,运行着一个Docker Registry服务 ...
  • 念爷爷
      今天是爷爷的头七,十二月七日、阴历十月廿三中午,老人家与世长辞。   九月初,回家看望刚动完手术的爸爸,发

  • 6 杨梅坑

  • liuhuashan
    深圳人才公园的网红景点 —— 流花山

  • 1 2020年10月拈花湾

  • 内核缺陷触发的NodePort服务63秒延迟问题
    现象 我们有一个新创建的TKE 1.3.0集群,使用基于Galaxy + Flannel(VXLAN模式)的容 ...
  • Galaxy学习笔记
    简介 Galaxy是TKEStack的一个网络组件,支持为TKE集群提供Overlay/Underlay容器网 ...
  • 彩彩 2020年6月黄崖关

  • 总部远眺 2020年5月深圳

  • 绚丽之花 寻味顺德

  • tuanbolake 团泊湖野餐

  • Istio中的透明代理问题
    为何需要透明代理 Istio的Sidecar作为一个网络代理,它拦截入站、出站的网络流量。拦截入站流量后,会使 ...
  • 重温iptables
    工作流图 下面这张图描述了一个L3的IP封包如何通过iptables:  对于此图的说明: Ipt ...
  • 从镜像中抽取文件
    动机 在某个应用场景中,我们需要在每个K8S节点上运行一个Agent,此Agent能够执行运维人员动态配置的P ...
  • 服务网格的现状和未来
    引言 服务网格(Service Mesh)是一种微服务治理基础设施,用于控制、监测微服务之间的东西向流量。它通 ...
  • 如何在Pod中执行宿主机上的命令
    基础知识回顾 要回答标题中的疑问,我们首先要清楚,Pod是什么? Pod的翻译叫容器组,顾名思义,是一组容器 ...
  • 通过ExternalDNS集成外部DNS服务
    简介 ExternalDNS项目的目的是,将Kubernetes的Service/Ingress暴露的服务(的 ...
TOPLINKS
  • Zitahli's blue 91 people like this
  • 梦中的婚礼 64 people like this
  • 汪静好 61 people like this
  • 那年我一岁 36 people like this
  • 为了爱 28 people like this
  • 小绿彩 26 people like this
  • 彩虹姐姐的笑脸 24 people like this
  • 杨梅坑 4 people like this
  • 亚龙湾之旅 1 people like this
  • 汪昌博 people like this
  • 2013年11月香山 10 people like this
  • 2013年7月秦皇岛 6 people like this
  • 2013年6月蓟县盘山 5 people like this
  • 2013年2月梅花山 2 people like this
  • 2013年淮阴自贡迎春灯会 3 people like this
  • 2012年镇江金山游 1 people like this
  • 2012年徽杭古道 9 people like this
  • 2011年清明节后扬州行 1 people like this
  • 2008年十一云龙公园 5 people like this
  • 2008年之秋忆 7 people like this
  • 老照片 13 people like this
  • 火一样的六月 16 people like this
  • 发黄的相片 3 people like this
  • Cesium学习笔记 63 people like this
  • IntelliJ IDEA知识集锦 59 people like this
  • 基于Kurento搭建WebRTC服务器 37 people like this
  • PhoneGap学习笔记 32 people like this
  • NaCl学习笔记 32 people like this
  • 使用Oracle Java Mission Control监控JVM运行状态 29 people like this
  • 基于Calico的CNI 27 people like this
  • Ceph学习笔记 25 people like this
  • Three.js学习笔记 22 people like this
Tag Cloud
ActiveMQ AspectJ CDT Ceph Chrome CNI Command Cordova Coroutine CXF Cygwin DNS Docker Eclipse ExtJS F7 FAQ Groovy Hibernate HTTP IntelliJ IO编程 IPVS JacksonJSON JMS JSON JVM K8S kernel LB libvirt Linux知识 Linux编程 LOG Maven MinGW Mock Monitoring Multimedia MVC MySQL netfs Netty Nginx NIO Node.js NoSQL Oracle PDT PHP Porting Redis RPC Scheduler ServiceMesh SNMP Spring SSL svn Tomcat TSDB Ubuntu WebGL WebRTC WebService WebSocket wxWidgets XDebug XML XPath XRM ZooKeeper 亚龙湾 单元测试 学习笔记 实时处理 并发编程 彩姐 性能剖析 性能调优 文本处理 新特性 架构模式 系统编程 网络编程 视频监控 设计模式 远程调试 配置文件 齐塔莉
Recent Comments
  • 绿色记忆:Nginx知识集锦 on Apache HTTP Server知识集锦
  • NotMeBug on AspectJ编程学习笔记
  • fx_carrot on Bazel学习笔记
  • bytebuddy简单入门 – FIXBBS on Byte Buddy学习笔记
  • 4.深入Istio源码:Pilot的Discovery Server如何执行xDS异步分发-站长之家 on Istio Pilot与Envoy的交互机制解读
  • 4.深入Istio源码:Pilot的Discovery Server如何执行xDS异步分发? - luozhiyun`s Blog on Istio Pilot与Envoy的交互机制解读
  • Shan Shuog on Socket.io学习笔记
  • Alex on Socket.io学习笔记
  • Shan Shuog on Socket.io学习笔记
  • Alex on 内核缺陷触发的NodePort服务63秒延迟问题
  • 林哲緯 on 内核缺陷触发的NodePort服务63秒延迟问题
  • smileyihui on Bazel学习笔记
  • Android分享:代码混淆那些事 – FIXBBS on ProGuard学习笔记
  • core on Bazel学习笔记
  • atuter on Bazel学习笔记
  • Alex on Istio中的透明代理问题
  • Yann on Istio中的透明代理问题
  • haige on H.264学习笔记
  • dandelion on Bazel学习笔记
  • 别放不下 on Gradle学习笔记
  • yanick on 内核缺陷触发的NodePort服务63秒延迟问题
  • 许铭毅 on 基于Kurento搭建WebRTC服务器
  • 许铭毅 on 基于Kurento搭建WebRTC服务器
©2005-2021 Gmem.cc | Powered by WordPress