Jprofiler基本使用
Posted cable-run
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Jprofiler基本使用相关的知识,希望对你有一定的参考价值。
JProfiler是什么
JProfiler是一个全功能的Java剖析工具,专用于分析J2SE和J2EE应用程序。它允许两个内存剖面评估内存使用情况和动态分配泄漏和CPU剖析
在开发过程中遇到过内存溢出的情况,大部分情况下我们可以通过设置JVM初始化内存大小来解决内存溢出的问题,另外一些情况是由于我们程序bug造成的,这种问题如果要查看代码去找,JProfiler是一款非常优秀的JVM分析工具,可以监控本地和远程的JVM,拥有多种操作系统的安装版本,常用功能如下:
- 监控堆内存的占用情况和创建对象实例的数量,找出内存泄露的原因
- 监控占用CPU较多的方法
- 监控线程的阻塞和死
- 监控GC的耗时
1.1 JVMTI
JDK 本身定义了目标明确并功能完善的JNI( Java Native Interface ) 与虚拟机直接进行交互,这些 API 能很方便的进行扩展,从而满足开发者各式的需求.
JVMTI( JVM Tool Interface) ,是JAVA虚拟机提供的本地接口,它是实现调度器以及其它Java运行测试与分析工具的基础.并不一定在所有的JDK提供商都有实现,但在主流的Oracle JDK、Open JDK上都有其实现.
在开发的过程中一般是使用Agent的方式来使用JVMTI,通过调用JVMTI的函数,从JVM中得到当前的运行信息.
JProfiler内部模型
JProfiler数据采集的原理
1.用户在JProfiler GUI中下达监控命令( 对应用户的一个点击 ).
2.JProfiler GUI通过自身Socket的8849端口向位于JVM的JProfiler Agent发送监控指令.
3.JProfiler Agent收到指令后向JVMTI注册事件或执行相关的命令.
4.JVMTI根据事件和命令的类型返回相对应的数据( 线程状态、对象实例、CPU负荷、GC状态信息等)
5.JProfiler Agent从JVMTI中得到相应数据后将对其进行计算,最终通过Socket传输给JProfiler GUI中进行展示.
JProfiler官网:http://www.ej-technologies.com/products/jprofiler/overview.html |
2.主要功能简介
- Telemetries 监控信息:
查看JVM的运行信息
- Live memory 内存剖析
JProfiler的内存视图部分可以提供动态的内存使用状况更新视图和显示关于内存分配状况信息的视图。所有的视图都有几个聚集层并且能够显示现有存在的对象和作为垃圾回收的对象。
- All Objects 所有对象
显示类或在状况统计和尺码信息堆上所有对象的包。你可以标记当前值并显示差异值。
- Record objects 记录对象
显示类或所有已记录对象的包。你可以标记出当前值并且显示差异值。
- Allocation call tree 分配访问树
显示一棵请求树或者方法、类、包或对已选择类有带注释的分配信息的J2EE组件。
- Allocation hot spots 分配热点
显示一个列表,包括方法、类、包或分配已选类的J2EE组件。你可以标注当前值并且显示差异值。对于每个热点都可以显示它的跟踪记录树。
- Heap walker 堆遍历
在JProfiler的堆遍历器(Heap walker)中,你可以对堆的状况进行快照并且可以通过选择步骤下寻找感兴趣的对象。堆遍历器有七个视图:
- Classes 类
显所有类和它们的实例。
- Allocations 分配
为所有记录对象显示分配树和分配热点。
- Biggest Objects 大对象
显示占用内存多的对象
- References 索引
为单个对象和"显示到垃圾回收根目录的路径"提供索引图的显示功能。还能提供合并输入视图和输出视图的功能。
- Time 时间
显示一个对已记录对象的解决时间的柱状图。
- CPU views CPU剖析
JProfiler 提供不同的方法来记录访问树以优化性能和细节。线程或者线程组以及线程状况可以被所有的视图选择。所有的视图都可以聚集到方法、类、包或J2EE组件等不同层上。CPU视图部分包括:
- Call tree 访问树
显示一个积累的自顶向下的树,树中包含所有在JVM中已记录的访问队列。JDBC,JMS和JNDI服务请求都被注释在请求树中。请求树可以根据Servlet和JSP对URL的不同需要进行拆分。
- Hotspots 热点
显示消耗时间最多的方法的列表。对每个热点都能够显示回溯树。该热点可以按照方法请求,JDBC,JMS和JNDI服务请求以及按照URL请求来进行计算。
- Call graph 访问图
显示一个从已选方法、类、包或J2EE组件开始的访问队列的图。
Method Statistics
Call Trace
javascript XHR
- Threads 线程剖析
对线程剖析,JProfiler提供以下视图
- Thread history 线程历史
显示一个与线程活动和线程状态在一起的活动时间表。
- Thread monitor 线程监控
显示一个列表,包括所有的活动线程以及它们目前的活动状况。
- Thread Dumps
- Monitors & locks
- Current Locking Graph 死锁探测图表
显示一个包含了所有在JVM里的死锁图表。
- Current Monitors 目前使用的监测器
显示目前使用的监测器并且包括它们的关联线程。
- Locking History Graph
- Monitor History 历史检测记录
显示重大的等待事件和阻塞事件的历史记录。
- Monitor Usage Statistics 监测使用状态
显示分组监测,线程和监测类的统计监测数据。
3.JProfiler 安装步骤
window下载完成后,双击运行"jprofiler_windows-x64_9_2.exe",启动安装向导,如下图所示:
按默认选择"Single or evaluation license",Name 和 Company 随意填!!!
JProfiler9.2注册码
因为我们是在服务器上面安装的,所以我们先不跟集成开发环境集成,直接点击next
最后我们点击Finish完成安装,并启动JProfiler
到这里JProfiler就安装完成了,接下来我们就可以使用这个工具来监控我们的程序了。
4.监视本地的Tomcat
看似是本地,其实JProfiler GUI在一个单独的JVM里启动,他与被监视的目标jvm之间通过socket通讯,目的为了不干扰目标JVM。所以监视本地Tomcat与监视远程的Tomcat的配置方法基本是一样的。当你学会了如何监控本地Tomcat,那么监控远程的Tomcat也就很容易了。
1,创建监控
在菜单栏点击"Srart Center",如下图所示:
2,选择部署的服务器容器
在面板中显示出了所有支持可以监视的多种服务器类型,包括Tomcat、JBoss等。因为我们使用Tomcat8.0部署web应用,所以我们选择Apache Tomcat 8.x,并点击下一步。
3,选择Tomcat容器的位置
当你想配置监视远程的Tomcat时,就可以选择 On a remote computer。 这里我们选择:On a this computer(在本机上),然后点击下一步。
4,选择虚拟机类型
因为所有的监视JVM的信息都是由JVM 所提供的接口(JVM TI)给出的,这里要注意选择正确JVM,这里使用的是Oracle(sun) 的 1.8.0 、 hotspot,你的JVM是32位不用打勾,是 64 位就要打勾,然后点击下一步。
5,选择启动监控的方式
对连接的时机控制有以下三种:
等待模式:wait for a connection from the Jprofiler GUI此模式为在启动容器Weblogic/Tomcat时,需要等Jprofiler连接后才能启动,JVM TI是采用事件通知方式告知JProfiler相关的Jvm的状态变化,等待模式可以不漏掉通知。
非等待模式:Start Immeditely此模式下容器Weblogic/Tomcat独立启动,Jprofiler随时可以连接。
离线模式:Profile offline, Jprofiler GUI cannot connect此模式为离线模式,生成相关记录文件事后分析。
这里我们选择第一项,然后点击下一步。
6,选择容器启动脚本
Tomat容器的启动可以由jprofiler来控制,jprofiler要修改启动文件加入JVM TI参数实现监视目的。 选择好Tomat启动脚本后jprofiler会自动为我们生成新的启动脚本在Tomcat的bin目录中,文件名是startup_jprofiler.bat,通过这个文件来启动Tomcat。 这里我选择的是tomcat 的startup.bat文件,然后点击下一步。
7,选择监控端口
只要不冲突就行,这里我们就使用默认的。JProfiler GUI 在一个单独的JVM里启动,为了不干扰目标JVM,他与被监视的目标jvm之间的通讯是通过socket实现的。
8,最后确认信息
信息的内容说创建了一个启动脚本,在相同的目录里。可以用它的来启动。其中添加了CATALINA_OPTS参数,别被你人为的覆盖了。
9,启动容器
这里选择立刻开始启动容器并进行监控,或者以后再启动。
立刻开始:启动窗口并监视JVM;
以后再启动:在Start Center->Open Session中查找创建的session并启动。
我们选择立即启动。
在启动过程还会出现以下几个窗口,选择默认即可。
9.1 Instrumentation重构模式
JProfiler将对需要分析的class字节码文件中写入自己的bytecode,?对于正在运行的JVM实例选择此模式将会重新加载字节码文件到JVM的运行时数据区域结构中?.
*?这是JProfiler全功能模式,在此设置中,调用堆栈信息是准确的,但是CPU开销可能很高( 取决于Filter的控制 ),若要分析的类较多,则对应用的性能产生影响,因此使用此模式一般配合Filter使用,只对特定的类或包进行分析.
9.2 Sampling抽样模式
此模式对CPU的开销非常低,但不支持某些功能( 方法的执行次数、执行时间等 ), 这种模式在连接正在运行的JVM实例时更为安全.
配置Filter( 适用于Instrumentation数据采集模式 )
配置Trigger( 多用在离线的启动模式 )
监控启动后如下图所示,我们便可以开始对应用进行监控了。
10.视图介绍
Telemetries视图:包含JMM内存的使用情况( 全局堆与非堆、局部伊甸园区、幸存者区、老年代)、GC线程的活动情况( 发生GC的时间,是属于Minor GC还是Full GC )、当前JVM实例的线程概况、CPU的负载等信息.
Live Memory视图:展示当前堆中实例的个数、方法的调用链等信息.
方法调用链信息:
Heap Walker视图:用于堆的快照分析,可以选择在Live Memory中记录的对象或者当前运行状态时堆的对象也可以直接在对象视图右键对象Show Selection In Heap Walker.
?CPU Views视图:可以按运行顺序逐级查看当前程序运行时的耗时、在一定时间内统计方法的执行效率.
程序运行耗时:
一定时间内统计方法的执行效率( 单位:微秒 ):
Total Time:执行总时长.
Inv:执行的次数.
Avg Time:方法平均执行时长.
Median Time:第中间次数的执行时长.
Min Time:最短执行时长.
Max Time:最大执行时长.
5.JProfiler远程监控Tomcat性能
很多时候我们的应用都是跑在linux,而jProfiler是安装在windows上面,这时候我们就需要通过配置远程连接对服务器上面的应用进行监控
1.在linux上安装jProfiler
从官网下载安装包:jprofiler_linux_10_1_4.tar.gz,软件版本要和windows版保持一致,然后上传到linux服务器并解压。
tar -zvxf jprofiler_linux_10_1_4.tar.gz |
2.修改tomcat配置
进入tomcat的bin目录,修改startup.sh文件,在文件开始增加如下配置:
JAVA_OPTS=‘-Xms256m -Xmx1024mm‘ CATALINA_OPTS="$CATALINA_OPTS $JPDA_OPTS -agentpath:/usr/local/jprofiler/jprofiler10.1.3/bin/linux-x64/libjprofilerti.so=port=8849,nowait" export CATALINA_OPTS |
然后启动tomcat,在tomcat日志文件中会输出jprofiler的启动日志
3.在windows上创建监控
打开jprofiler程序,在Session菜单中打开"Integration Wizards",选择"New Remote Integration",打开配置对话框。
4.设置jdk版本
5.设置连接地址
设置linux中jprofiler安装路径/找到 JP 在 Linux 中的安装路径
[root@test1 bin]# whereis jprofiler jprofiler: /usr/local/bin/jprofiler /usr/local/jprofiler9.1 /opt/jprofiler9/bin/jprofiler.vmoptions /opt/jprofiler9/bin/jprofiler /opt/jprofiler9/bin/jprofiler.jar |
6.设置端口
7.查看配置汇总信息
8.启动监控
6.最总测试
- 打开本地或者服务器安装路径,会生成startup_jprofiler.sh文件
- 将startup_jprofiler.sh 上传到 Linux 服务器的项目应用的?/usr/local/tomcat/tomcat_jdt/bin 下,并授予可执行的权限
|
- 终极配置到此完成
- 先关闭当前项目的 Tomcat ,然后 通过上传的脚本文件 startup_jprofiler.sh 来启动项目
|
- 在 jprofiler 点击 Start 启动
7.Tomcat下载
8.Java / tomcat 查看版本
9.Linux安装JDK
1.Linux默认自带jdk 检查Linux中自带jdk版本
[root@localhost ~]# java -version openjdk version "1.8.0_161" OpenJDK Runtime Environment (build 1.8.0_161-b14) OpenJDK 64-Bit Server VM (build 25.161-b14, mixed mode) |
检测Linux中所有(-a)已安装(-q)程序名字中含有‘jdk‘的程序列表
[user@localhost ~]$ rpm -qa | grep jdk copy-jdk-configs-3.3-2.el7.noarch java-1.8.0-openjdk-headless-1.8.0.161-2.b14.el7.x86_64 java-1.7.0-openjdk-1.7.0.171-2.6.13.2.el7.x86_64 java-1.8.0-openjdk-1.8.0.161-2.b14.el7.x86_64 java-1.7.0-openjdk-headless-1.7.0.171-2.6.13.2.el7.x86_64 |
删除已有的jdk
并用java -version 显示 -bash: /bin/java: 没有那个文件或目录# 说明删除成功
rpm -e --nodeps java-1.8.0-openjdk-headless-1.8.0.161-2.b14.el7.x86_64 rpm -e --nodeps java-1.7.0-openjdk-1.7.0.171-2.6.13.2.el7.x86_64 rpm -e --nodeps java-1.8.0-openjdk-1.8.0.161-2.b14.el7.x86_64 rpm -e --nodeps java-1.7.0-openjdk-headless-1.7.0.171-2.6.13.2.el7.x86_64 |
解压 jdk-8u191-linux-x64.tar.gz安装包
[root@localhost software]# mkdir -p /usr/local/java [root@localhost software]# tar -zxvf jdk-8u191-linux-x64.tar.gz -C /usr/local/java [root@localhost software]# ll -rw-r--r--. 1 root root 9125027 12月 27 20:00 apache-tomcat-7.0.92.tar.gz -rw-r--r--. 1 root root 191753373 12月 27 19:00 jdk-8u191-linux-x64.tar.gz |
10.Linux安装Tomcat
[user@localhost ~]$ rpm -qa | grep tomcat bash: npm: 未找到命令...# 当前是无tomcat相关程序 上一步如有tomcat程序 删除已有的tomcat程序 并在上面的图像步骤中下载新的tomcat rpm -e --nodeps tomcat
[root@localhost software]# mkdir -p /usr/local/tomcat [root@localhost software]# tar -zxvf apache-tomcat-7.0.92.tar.gz -C /usr/local/tomcat [root@localhost bin]# firewall-cmd --zone=public --list-ports # Linux显示开放的端口
|
?
?
13.Linux配置Java环境变量
1.将免安装的JDK拷贝到linux目录下
|
2.更改环境变量
vim /etc/profile
加入如下代码:
|
3.刷新配置
|
14.如何查看linux是32位还是64位
Linux:
"getconf LONG_BIT" |
- 如果返回的是32,那么就是32位
- 如果返回的是64,那么就是64位
15.Jprofiler官方下载
以上是关于Jprofiler基本使用的主要内容,如果未能解决你的问题,请参考以下文章