详细解析:Java性能分析神器-JProfiler详解
优采云 发布时间: 2022-11-07 06:13详细解析:Java性能分析神器-JProfiler详解
一、什么是JProfiler JProfiler是ej-technologies GmbH开发的性能瓶颈分析工具(该公司也开发部署工具)。其特点:使用方便,界面友好,操作友好,对被分析应用影响小 平台 2. 数据采集Q1. 既然 JProfiler 是一个性能瓶颈分析工具,那么这些分析的相关数据是从哪里来的呢?Q2。JProfiler 如何采集和显示这些数据?A1。分析数据主要来自以下两部分 1、部分来自jvm分析接口**JVMTI**(JVM Tool Interface),JDK必须>=1.6JVMTI是基于事件的系统。分析代理库可以为不同的事件注册处理函数。然后它可以启用或禁用选定的事件,例如:对象生命周期、线程生命周期等。
3. JProfiler Agent(如果不了解Agent,请看文章Part 3“启动模式”)收到指令后,将指令转换成相关事件或需要监控的指令,注册到JVMTI 或者直接让JProfiler Agent JVMTI 执行一个功能(比如dump jvm 内存) 4. JVMTI 根据注册的事件采集当前jvm 的信息。例如:线程的生命周期;jvm的生命周期;类的生命周期;对象实例的生命周期;堆内存等的实时信息,按照一定的规则(如果所有数据都发送到JProfiler GUI,将对正在分析的应用网络产生较大的影响) 6. 返回JProfiler GUI Socket.7。JProfiler GUI Socket 将接收到的信息返回给 JProfiler GUI Render8。JProfiler GUI Render 渲染最终的显示效果 3. Data采集 方法和启动方式 A1. JProfier采集方法分为两种:Sampling(sample采集)和InstrumentationSampling:类似于sample统计,每个线程栈的method stack中的信息都是定时(5ms)统计的。
优点是对应用影响不大(即使不配置任何Filter,Filter可以参考文章第四部分),缺点是不能提供一些数据/特征(例如:方法调用次数) Instrumentation:在类加载之前,JProfier将相关的功能代码写入待分析的类中,对运行的jvm有一定的影响。优点:功能强大,但是如果要分析的类很多,对应用的影响会比较大。一般与Filter配合使用。所以一般的JRE类和框架类通常在Filter中被过滤掉。注意:JProfiler 本身并没有指明 采集 类型的数据,这里的 采集 类型是 采集 类型用于方法调用。因为JProfiler的大部分核心功能都依赖于方法调用采集的数据,所以可以直接认为是JProfiler的数据采集类型。A2:启动方式:Attach方式可以直接将本机正在运行的jvm加载到JProfiler Agent中。优点是很方便,缺点是有些功能不能支持。如果选择 Instrumentation data采集 方法,重写需要分析的类会花费一些额外的时间。Profile at startup 在被分析的 jvm 启动时手动将指定的 JProfiler Agent 加载到 jvm 中。Attach模式可以直接将本机正在运行的jvm加载到JProfiler Agent中。优点是很方便,缺点是有些功能不能支持。如果选择 Instrumentation data采集 方法,重写需要分析的类会花费一些额外的时间。Profile at startup 在被分析的 jvm 启动时手动将指定的 JProfiler Agent 加载到 jvm 中。Attach模式可以直接将本机正在运行的jvm加载到JProfiler Agent中。优点是很方便,缺点是有些功能不能支持。如果选择 Instrumentation data采集 方法,重写需要分析的类会花费一些额外的时间。Profile at startup 在被分析的 jvm 启动时手动将指定的 JProfiler Agent 加载到 jvm 中。
JProfiler GUI通过socket向JProfiler Agent发送采集信息类型、策略等配置信息,收到信息后jvm才会启动。在分析的jvm的启动参数中添加如下内容: 语法:-agentpath:[jprofilerti库的路径][注意]:语法不清楚也没关系,JProfiler提供了帮助向导。Prepare for profiling:和Profile at startup的主要区别:被分析的jvm可以在不从JProfiler GUI接收相关配置信息的情况下启动。离线 profiling 一般用于无法直接在线调试的场景。离线profiling需要打包信息采集内容和策略(部分Triggers请参考文章第五部分 ) 到一个配置文件(config.xml)中,当jvm在线启动并加载JProfiler Agent时,加载那个xml。然后JProfiler Agent会根据Trigger的类型生成不同的信息。例如:堆转储;线程转储;方法调用记录等语法:-agentpath:/home/2080/jprofiler8/bin/Linux-x64/libjprofilerti.so=offline,id=151,config=/home/2080/config.xml [注]:采集 config.xml中每个被分析的jvm的信息都有一个id来识别。
四。JProfiler核心概念Filter:需要分析什么类。有两种类型的过滤器收录和不收录。Profiling Settings: Receipt 采集 strategy: Sampling and Instrumentation,一些数据采集细节可以自定义。Triggers:一般用在**offline**模式,告诉JProfiler Agent什么时候触发什么行为来采集指定的信息。Live memory:关于类/类实例的信息。比如对象的数量和大小,对象创建的方法执行栈,对象创建的热点。Heap walker:静态分析一定时间内采集到的内存对象信息,功能强大,好用。收录传出引用、传入引用、最大对象等对象的CPU视图:CPU消耗分布和时间(cpu时间或运行时间);方法执行图;方法执行统计(最大值、最小值、平均运行时间等) 线程:当前jvm所有线程的运行状态,持有锁的线程的状态,可以dump线程。Monitors & locks:所有线程持有锁和锁信息 Telemetries:趋势图(遥测视图)包括堆、线程、gc、类等 理解上面的相关概念。
JProfiler自带的例子如下: 模拟内存泄露和线程阻塞的场景:具体源码参考:/jprofiler install path/demo/bezierLeak 内存模拟内存泄露,模拟阻塞模拟线程间锁的阻塞) A1 . 首先我们来分析一下内存泄漏的场景:(Check Leak Memory 模拟内存泄漏) 1. 在**Telemetries->Memory** 视图中,你会看到如下图所示的场景(你可以执行Run GC at查看过程中的intervals函数):见下图蓝色区域,gc后老年代的内存大小(**valley**)在Live memory->中缓慢增加(理想情况下,这个值应该是稳定的) Recorded Objects 点击**记录分配数据**按钮,开始统计一段时间内创建的对象信息。
最后,您看到的信息可能类似于下图。分析刚刚记录在Heap walker中的对象信息,点击实例最多的类。右键单击 **Use Selected Instances->Reference->Incoming Reference**。发现Long数据最终存放在**bezier.BaierAnim.leakMap**中。在 Allocations 选项卡中,右键单击其中一种方法以查看特定的源代码信息。【注意】:问题到这里已经很清楚了,明白为什么图17中的实例数是一样的,为什么fullgc后内存不能回收(老区的一个对象leakMap,put信息会也进入老区,如果leakMap不能回收,那么map中收录的对象也不能回收)。A2。
观察**Monitors & locks->Monitor History**一段时间后,你会发现出现锁的情况有4种。第一种:AWT-EventQueue-0线程持有Object锁,处于Waiting状态。下面的代码表示 Demo.block 方法调用了 object.wait 方法。这还是比较容易理解的。第二种:AWT-EventQueue-0持有bezier.BezierAnim$Demo实例上的锁,测试线程等待线程释放。注意下图底部的源代码。这个锁的原因是Demo的blcok方法会在AWT和测试线程中都执行,并且方法是同步的。第三种和第四种:测试线程会不断的发送事件给Event Dispatching Thread提交任务,导致对 java.awt.EventQueue 对象锁的竞争。提交任务的方式如下代码: repaint() 和 EventQueue.invokeLater public void run() {Thread me = Thread.currentThread();while (thread == me) {repaint();if (block) { block(false);}try {Thread.sleep(10);} catch (Exception e) {break;}EventQueue.invokeLater(new Runnable() {@Overridepublic void run() {onEDTMethod();}});} thread = null ;}六。最佳实践 JProfiler 会给出一些特殊操作的提示,此时最好仔细阅读说明。“标记当前”功能在某些场景下非常有效。Heap walker一般是Live memory中的静态分析-> while (thread == me) {repaint();if (block) {block(false);}try {Thread.sleep(10);} catch (Exception e) {break;}EventQueue.invokeLater(new Runnable() {@Overridepublic void run() {onEDTMethod();}});}thread = null ;}六。最佳实践 JProfiler 会给出一些特殊操作的提示,此时最好仔细阅读说明。“标记当前”功能在某些场景下非常有效。Heap walker一般是Live memory中的静态分析-> while (thread == me) {repaint();if (block) {block(false);}try {Thread.sleep(10);} catch (Exception e) {break;}EventQueue.invokeLater(new Runnable() {@Overridepublic void run() {onEDTMethod();}});}thread = null ;}六。最佳实践 JProfiler 会给出一些特殊操作的提示,此时最好仔细阅读说明。“标记当前”功能在某些场景下非常有效。Heap walker一般是Live memory中的静态分析-> 功能在某些场景下非常有效。Heap walker一般是Live memory中的静态分析-> 功能在某些场景下非常有效。Heap walker一般是Live memory中的静态分析->
这种现象是正常的。您可以在工具栏中的“开始录制”工具栏中配置一次性信息采集。收录和排除是有序的。注意,可以使用下图左下方的“Show Filter Tree”来验证order_2014_10_17_3_41_18_PM(图25)七。参考 JProfiler 助手:JVMTI:
内容更新是增加现有内容流量的最佳方式之一,也是让您的 自媒体 或 网站 信息保持新鲜和更新的好方法。而文章采集器 让你拥有自己的文章 库,告别没有想法的写文章。网站填充数据内容不会遭受无内容填充。当你读了几万篇文章,创作了几千篇文章,你就会发现文章的所有写作技巧和营销套路。全网一键免费行业内容采集如图!
页面 关键词 和 关键词 密度优化
许多搜索引擎和 自媒体 平台使用页面的关键字密度来确定页面与关键字的相关性。相关性越高,页面的相关性就越高。因此,应确保关键词 在整个网页中得到充分合理的利用。
关键词分布式布局的具体方法是:
● 利用所有可用的因素,但不要重复或简单地安排关键词;
● 遵循必要的语法规则,形成自然流畅的句子,使网页更具吸引力;
● 从页面因素优化的角度,考虑在页面标题元素、页面描述/关键字元素、正文标题、正文内容、文本链接和 ALT 标记之间分配关键字。
如何优化内容
1.标题很吸引人
俗话说,一个好的开始是成功的一半,所以创造一个有吸引力的标题是成功的第一步。除了引人入胜之外,内容标题还应突出网站核心关键词。研究表明,文章 作品通常只吸引 5 秒。
如果文章标题未能引起用户的兴趣,让用户继续浏览内容,则用户继续浏览内容的希望渺茫。如果我们的文章标题更吸引人、更新颖,可以立即激发用户的阅读兴趣,这样才能让用户在我们的网站上停留更久。
2.提高内容质量
优质的原创内容是网站优化的基础,是提升企业品牌形象的关键。因此,高质量的原创文章可以更好地满足搜索引擎的需求,最大限度地满足用户的搜索需求。所以,只有写出更多符合搜索引擎和用户需求的文章,他们才会更加喜欢和认可我们的网站。
在内容优化的过程中,除了优质的原创内容外,还要注意内容的更新时间。定时更新时间方便搜索引擎抓取收录,也能有效培养用户行为习惯,实现原创内容。网站 整体流量稳步增长。
3.内容不断更新
可持续的内容也是 网站 运营成功的关键。随着时间的推移,网站中已经收录的部分内容会为网站带来更多的流量和更高的权重。
如果网站的内容不断更新,保证新鲜度和及时性,用户可以随时随地感受我们的网站变化,增加页面收录。只有每天更新一些优质内容,呈现给用户,才能全面提升网站的权重。对于一些长期不更新内容的网站来说,总会面临被降级的风险。
4.内容关键词合理布局
关键词布局可以在一定程度上促进网站内容的优化。关键词密度是指关键词在文章文章中出现的频率和次数。通常,关键词 会分布在文章 的开头、中间和结尾。以关键词 为文章 开始,文章 的整体权重也会增加。
因为搜索引擎遵循从左到右的模式来索引和捕获信息,所以 文章 的开头通常是搜索引擎首先读取的内容。
但是在使用关键词布局的时候,一定要注意适度,即要保证关键词以最自然的方式适配文章,没有关键词堆积的现象,否则我们的 网站 将面临被降级的风险。返回搜狐,查看更多