使用JProfiler进入JVM分析

 要评测JVM,必须将JProfiler的评测代理加载到JVM中。这可以通过两种不同的方式发生:在启动脚本中指定-agentpath VM参数,或者使用attach API将代理加载到已经运行的JVM中。
JProfiler支持这两种模式。添加VM参数是评测的首选方式,集成向导、IDE插件和会话配置都会使用它来从JProfiler中启动JVM。连接可以通过SSH在本地和远程进行。

一、-agentpath VM参数

了解加载评测代理的VM参数是如何组成的非常有用。-agentpath是JVM提供的一个通用VM参数,用于加载任何类型的使用JVMTI接口的本机库。因为评测接口JVMTI是本机接口,所以评测代理必须是本机库。这意味着您只能在明确支持的平台上进行评测。32位和64位JVM也需要不同的本机库。另一方面,Java代理加载了-javaagent-VM参数,并且只能访问有限的一组功能。
在-agentpath:之后,将附加到本机库的完整路径名。有一个等效的参数-agentlib:您只指定特定于平台的库名称,但必须确保库包含在库路径中。在库的路径之后,可以添加等号并将选项传递给代理,选项之间用逗号分隔。例如,在Linux上,整个参数可能如下所示:

-agentpath:/opt/jprofiler10/bin/linux-x64/libjprofilerti.so=port=8849,nowait

     第一个等号将路径名与参数分隔开,第二个等号是参数port=8849的一部分。这个通用参数定义了评测代理侦听JProfiler GUI连接的端口。8849实际上是默认端口,因此您也可以省略该参数。但是,如果您想在同一台机器上评测多个JVM,则必须分配不同的端口。IDE插件和本地启动的会话会自动分配此端口,对于集成向导,您必须明确选择端口。
     第二个参数nowait告诉评测代理不要在启动时阻塞JVM,等待JProfiler GUI连接。启动时阻止是默认的,因为评测代理不会将其评测设置作为命令行参数接收,而是从JProfiler GUI或配置文件接收。命令行参数仅用于引导评测代理,告诉它如何启动以及传递调试标志。
      默认情况下,JProfiler代理将通信套接字绑定到所有可用的网络接口。如果出于安全原因不需要这样做,您可以添加选项address=[IP address],以便选择一个特定的接口或环回,只侦听来自本地机器的请求。后者是为JProfiler UI或IDE集成启动的JVM自动添加的。

二、本地启动的会话

就像IDE中的“运行配置”一样,您可以直接在JProfiler中配置本地启动的会话。指定类路径、主类、工作目录、VM参数和自变量,JProfiler将为您启动会话。JProfiler附带的所有演示会话都是本地启动的会话。

一种特殊的启动模式是“Web Start”,您可以选择JNLP文件的URL,JProfiler将启动JVM来对其进行评测。此功能支持OpenWebStart,不支持Java 9之前的Oracle JRE中的遗留WebStart。 

 通过从主菜单中调用会话->转换向导,可以使用转换向导将本地启动的会话转换为独立会话。将Application Session转换为Remote只需创建一个启动脚本,并将-agentpath VM参数插入Java调用中。将应用程序会话转换为脱机会创建一个脱机评测的启动脚本,这意味着在启动时加载配置,不需要JProfiler GUI。将应用程序会话转换为Redistributed会话也可以执行同样的操作,但会在其旁边创建一个目录jprofiler_dist,其中包含评测代理和配置文件,这样您就可以将其发送到未安装jprofiler的其他计算机。

如果您自己开发分析的应用程序,请考虑使用IDE集成,而不是启动会话。它将更加方便,并为您提供更好的源代码导航。如果您不是自己开发应用程序,但已经有了启动脚本,请考虑使用远程集成向导。它将告诉您必须添加到Java调用中的确切VM参数。

三、集成向导

JProfiler的集成向导使用启动脚本或配置文件来处理许多众所周知的第三方容器,这些脚本或配置可以通过编程方式进行修改,以包含额外的VM参数。对于某些产品,可以生成启动脚本,其中VM参数作为参数或通过环境变量传递。

在所有情况下,您都必须从第三方产品中找到一些特定的文件,因此JProfiler有必要的上下文来执行其修改。一些通用向导只向您提供有关必须执行哪些操作才能启用评测的说明。

 每个集成向导的第一步是选择在本地计算机上还是在远程计算机上进行配置文件。在本地机器的情况下,您必须提供较少的信息,因为JProfiler已经知道平台、JProfileer的安装位置及其配置文件的位置。

 一个重要的决定是上面讨论的“启动模式”。默认情况下,评测设置在启动时从JProfiler UI传输,但您也可以告诉评测代理让JVM立即启动。在后一种情况下,一旦JProfiler GUI连接,就可以应用配置文件设置。

 不过,您也可以指定一个配置文件和配置文件设置,这样效率会高得多。这是在配置同步步骤中完成的。这种情况下的主要问题是,每次在本地编辑分析设置时,都必须将配置文件与远程端同步。最优雅的方法是在远程地址步骤中通过SSH连接到远程机器,然后可以通过SSH自动传输配置文件。

 在集成向导结束时,将创建一个会话,开始分析,在非通用情况下,还启动第三方产品,如应用程序服务器。

 外部启动脚本由会话配置对话框的“应用程序设置”选项卡上的“执行启动脚本”和“执行停止脚本”选项处理,并且可以通过选中“使用URL打开浏览器”复选框来显示URL。这也是您可以更改远程机器地址和配置同步选项的地方。

集成向导都处理评测JVM在远程机器上运行的情况。但是,当必须修改配置文件或启动脚本时,必须将其复制到本地计算机,并将修改后的版本传输回远程计算机。直接运行命令行工具可能更方便jpintegrate在远程机器上,并让它就地执行修改。jpintegrate需要完整安装JProfiler,并且具有与JProfilerGUI相同的JRE要求。

 当启动远程评测会话时发生错误时,请参阅故障排除指南,以获取解决问题的步骤清单。

四、IDE集成

评测应用程序最方便的方法是通过IDE集成。如果您通常在开发过程中从IDE启动应用程序,那么IDE已经具备了所有必需的信息,JProfiler插件可以简单地添加VM参数进行评测,必要时启动JProfileer,并将评测的JVM连接到JProfiler主窗口。
所有IDE集成都包含在JProfiler安装的integrations目录中。原则上,该目录中的归档文件可以通过相应IDE中的插件安装机制手动安装。但是,安装IDE集成的首选方式是从主菜单中调用会话->IDE集成。 

 

IDE中的评测会话不会在JProfiler中获得自己的会话条目,因为这样的会话无法从JProfilerGUI启动。根据IDE中的设置,分析设置以每个项目或每次运行的配置为基础进行持久化。
当连接到IDE时,JProfiler在工具栏中显示一个窗口切换器,可以轻松地跳回到IDE中的相关窗口。现在,所有ShowSource操作都直接在IDE中显示源代码,而不是JProfiler中的内置源代码查看器。

五、附加模式

您不必事先决定要评测JVM。使用JProfiler中的附加功能,您可以选择一个正在运行的JVM并动态加载评测代理。虽然连接模式很方便,但它有几个缺点,您应该注意:

  • 您必须从正在运行的JVM列表中确定要评测的JVM。如果许多JVM在同一台机器上运行,这有时会很棘手。
  • 还有额外的开销,因为可能需要重新定义许多类才能添加插入。
  • JProfiler中的某些功能在附加模式下不可用。这主要是因为JVMTI的某些功能只能在JVM初始化时打开,而在JVM生命周期的后期阶段不可用。
  • 有些功能需要在所有类的很大一部分中插入。在加载类时进行检测是很便宜的,而在稍后加载类时添加检测则不然。使用附着模式时,默认情况下会禁用这些功能。
  • OpenJDK JVM、版本6或更高版本的Oracle JVM、最新的OpenJ9 JVM(8u281+、11.0.11+或Java 17+)或基于此类版本的IBM JVM都支持附加功能。不能为JVM指定VM参数-XX:+PerfDisableSharedMem和-XX:+DisableAttachMechanism。
  • JProfiler的启动中心中的Quick Attach选项卡列出了所有可以分析的JVM。列表项的背景色指示是否已加载分析代理、当前是否已连接JProfiler GUI或是否已配置脱机分析。
  • 启动分析会话时,可以在会话设置对话框中配置分析设置。当您重复配置同一进程时,您不希望一次又一次地重新输入同一配置,因此当您关闭使用快速连接功能创建的会话时,可以保存持久会话。下次要评测此进程时,请从“打开会话”选项卡而不是“快速连接”选项卡启动保存的会话。您仍然需要选择一个正在运行的JVM,但评测设置与您之前配置的设置相同。 

 

 六、附加到本地服务

JVM中的attach API要求调用进程以与要附加到的进程相同的用户身份运行,因此JProfiler显示的JVM列表仅限于当前用户。不同用户启动的流程大多是服务。连接到服务的方式因基于Windows、Linux和Unix的平台而异。
在Windows上,“附加”对话框有一个“显示服务”按钮,列出所有本地运行的服务。JProfiler启动桥接可执行文件,以便能够连接到这些进程,无论它们与哪个用户一起运行。

 在Linux上,JProfiler支持通过PolicyKit直接在UI中切换用户,PolicyKit是大多数Linux发行版的一部分。通过单击附加对话框中的切换用户,可以输入不同的用户名并使用系统密码对话框进行身份验证。

在包括macOS在内的基于Unix的平台上,您可以执行命令行工具jpenable作为不同的用户su或sudo,具体取决于您的Unix变体或Linux发行版。在基于macOS和Debian的Linux发行版(如Ubuntu)上,使用sudo。
用sudo命令:

sudo -u userName jpenable

对于su,所需的命令行是:

su userName -c jpenable

jpenable将允许您选择JVM,并告诉您评测代理正在侦听的端口。在启动中心的“快速连接”选项卡上,然后可以选择“在另一台计算机上”选项,并配置到localhost和给定配置文件端口的直接连接。

七、 连接到远程计算机上的JVM

最苛刻的评测设置是远程评测——JProfiler GUI在本地机器上运行,评测JVM在另一台机器上运行。对于将-agentpath VM参数传递到配置文件JVM的设置,您必须在远程计算机上安装JProfiler,并在本地计算机上设置远程会话。使用JProfiler中的远程连接功能,不需要进行此类修改,只需要SSH凭据即可登录到远程计算机。
SSH连接使JProfiler能够上传“安装JProfileer”帮助主题中讨论的代理程序包,并在远程计算机上执行包含的命令行工具。您不需要在本地机器上设置SSH,JProfiler自带实现。在最简单的设置中,您只需定义主机、用户名和身份验证。
通过SSH连接,JProfiler可以自动发现正在运行的JVM,或者连接到分析代理已经在侦听的特定端口。对于后一种情况,您可以使用jpenable或jpintegrate,并准备一个特殊的JVM进行评测。然后,可以将SSH远程连接配置为直接连接到配置的分析端口。

 自动发现将列出远程计算机上已作为SSH登录用户启动的所有JVM。在大多数情况下,这将不是启动您要配置文件的服务的用户。由于启动服务的用户通常不允许SSH连接,JProfiler添加了一个Switch User超链接,允许您使用sudo或su切换到该用户。

在复杂的网络拓扑中,有时无法直接连接到远程计算机。在这种情况下,您可以告诉JProfiler在GUI中使用多跳SSH隧道进行连接。在SSH隧道的末端,您可以建立一个直接的网络连接,通常连接到“127.0.0.1”。

 只能为使用SSH登录用户启动的JVM拍摄HPROF快照。这是因为HPROF快照需要一个中间文件,该文件是用启动JVM的用户的访问权限编写的。出于安全原因,无法将文件权限传输给SSH登录用户进行下载。对于完整的分析会话,不存在这样的限制。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/77285.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入了解 PostgreSQL 扩展插件

深入了解 PostgreSQL 扩展插件 在 PostgreSQL 数据库中,扩展插件是极具价值的工具,它们为我们提供了丰富多样的功能增强。本篇博客将深入介绍几个常用的 PostgreSQL 扩展插件,包括 pg_stat_statements、uuid、postgis 以及 postgis_raster。…

【MATLAB第58期】基于MATLAB的PCA-Kmeans、PCA-LVQ与BP神经网络分类预测模型对比

【MATLAB第58期】基于MATLAB的PCA-Kmeans、PCA-LVQ与BP神经网络分类预测模型对比 一、数据介绍 基于UCI葡萄酒数据集进行葡萄酒分类及产地预测 共包含178组样本数据,来源于三个葡萄酒产地,每组数据包含产地标签及13种化学元素含量,即已知类…

【新版系统架构补充】-嵌入式技术

嵌入式微处理体系结构 冯诺依曼结构 传统计算机采用冯诺依曼结构,也称普林斯顿结构,是一种将程序指令存储器和数据存储器合并在一起的存储器结构 冯诺依曼的计算机程序和数据共用一个存储空间,程序指令存储地址和数据存储地址指向同一个存…

回归预测 | MATLAB实现SO-CNN-BiLSTM蛇群算法优化卷积双向长短期记忆神经网络多输入单输出回归预测

回归预测 | MATLAB实现SO-CNN-BiLSTM蛇群算法优化卷积双向长短期记忆神经网络多输入单输出回归预测 目录 回归预测 | MATLAB实现SO-CNN-BiLSTM蛇群算法优化卷积双向长短期记忆神经网络多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 MATLAB实现SO-CN…

uni-app 微信小程序自定义导航栏

一、效果图 二、导航栏的组成 上面的导航栏主要由状态栏(就是手机电量显示栏)和小程序的导航栏组成,android手机一般为48px,ios手机一般为44px 三、开发步骤 1、设置navigationStyle:custom {"path": "pages/v…

机器学习-特征选择:如何使用Lassco回归精确选择最佳特征?

一、引言 特征选择在机器学习领域中扮演着至关重要的角色,它能够从原始数据中选择最具信息量的特征,提高模型性能、减少过拟合,并加快模型训练和预测的速度。在大规模数据集和高维数据中,特征选择尤为重要,因为不必要的…

MySQL库的操作

MySQL库的操作 1. 库的操作 1.1 创建数据库 语法: CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [,create_specification] ...]create_specification: [DEFAULT] CHARACTER SET charset_name [DEFAULT] COLLATE collation_name说明&#xff…

Grafana集成prometheus(4.Grafana添加预警)

上文已经完成了grafana对prometheus的集成及数据导入,本文主要记录grafana的预警功能(以内存为例) 添加预警 添加入口(2个) databorard面板点击edit,下方有个Alert的tab,创建Alert rules依赖…

探索PostgreSQL的新功能:最新版本更新解析

PostgreSQL作为一种强大而开源的关系型数据库管理系统,不断在不断进化和改进。每一次的版本更新都带来了更多功能和改进,让用户在处理大规模数据和复杂查询时体验更好的性能和功能。在本文中,我们将深入探索PostgreSQL的最新版本更新&#xf…

小程序自定义tabBar+Vant weapp

1.构建npm,安装Vant weapp: 1)根目录下 ,初始化生成依赖文件package.json npm init -y 2)安装vant # 通过 npm 安装 npm i vant/weapp -S --production 3)修改 package.json 文件 开发者工具创建的项…

C高级DAY3

一、思维导图 二、判断家目录下普通文件和目录文件的个数 #!/bin/bash cd /home/ubuntu file$(ls -l | grep "^-" | wc -l) dir$(ls -l | grep ^d | wc -l)三、输入一个文件名,判断是否为shell脚本文件,如果是脚本文件判断是否有可执行权限&a…

【Mybatis】XML映射文件

目录 11.3XML映射文件 1.select 2.insert、update、delete 3.Sql 4.parameters(参数) 5.resultMap 6.resultMap 使用示例 (1)在先前创建的数据库stu中创建表student 2,并插入若干条数据,代码如下: (2)创建工程mybatis_ResultMap_demo。 (…

【云原生】k8s中Contrainer 生命周期回调/策略/指针学习

个人主页:征服bug-CSDN博客 kubernetes专栏:kubernetes_征服bug的博客-CSDN博客 目录 1 容器生命周期 2 容器生命周期回调/事件/钩子 3 容器重启策略 4 自定义容器启动命令 5 容器探针 1 容器生命周期 Kubernetes 会跟踪 Pod 中每个容器的状态&am…

使用强化学习破解迷宫实战

大家好,本文将实现一种强化学习算法来解决迷宫问题,并完成以下步骤:创建迷宫环境、定义迷宫类,以及使用值迭代算法(Value Iteration algorithm)找到穿越迷宫的最优策略。为了使这一过程可视化,使…

模板方法模式——定义算法的框架

1、简介 1.1、概述 模板方法模式是结构最简单的行为型设计模式,在其结构中只存在父类与子类之间的继承关系。通过使用模板方法模式,可以将一些复杂流程的实现步骤封装在一系列基本方法中。在抽象父类中提供一个称之为模板方法的方法来定义这些基本方法…

RabbitMQ 教程 | 第11章 RabbitMQ 扩展

👨🏻‍💻 热爱摄影的程序员 👨🏻‍🎨 喜欢编码的设计师 🧕🏻 擅长设计的剪辑师 🧑🏻‍🏫 一位高冷无情的编码爱好者 大家好,我是 DevO…

webpack基础知识一:说说你对webpack的理解?解决了什么问题?

一、背景 Webpack 最初的目标是实现前端项目的模块化,旨在更高效地管理和维护项目中的每一个资源 模块化 最早的时候,我们会通过文件划分的形式实现模块化,也就是将每个功能及其相关状态数据各自单独放到不同的JS 文件中 约定每个文件是一…

Java thymeleaf bug排查记录

刚学Java 做项目时报了一个错误 一时间看的莫名其妙 EL1008E: Property or field createTime cannot be found on object of type java.util.HashMap - maybe not public or not valid? 随即向上排查至第一个报错,发现是thymeleaf渲染时报错。 Exception proces…

leetcode 1290.二进制链表转整数

⭐️ 题目描述 &#x1f31f; leetcode链接&#xff1a;二进制链表转整数 ps&#xff1a; 1 0 1 (0 << 1) 1 0 1 1 (1 << 1) 0 2 0 2 (2 << 1) 1 4 1 5代码&#xff1a; int getDecimalValue(struct ListNode* head) {int ans 0;while(head !…

【数据结构】常见的排序算法

常见的排序算法 常见的排序算法插入排序之直接插入排序时间复杂度特性总结 插入排序之希尔排序时间复杂度 选择排序之直接选择排序特性总结 选择排序之堆排序时间复杂度特性总结 交换排序之冒泡排序特性总结 交换排序之快速排序hoare版本挖坑法双指针法快速排序的优化1&#xf…