使用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登录用户进行下载。对于完整的分析会话,不存在这样的限制。
相关文章:
使用JProfiler进入JVM分析
要评测JVM,必须将JProfiler的评测代理加载到JVM中。这可以通过两种不同的方式发生:在启动脚本中指定-agentpath VM参数,或者使用attach API将代理加载到已经运行的JVM中。 JProfiler支持这两种模式。添加VM参数是评测的首选方式,集…...
高级web前端开发工程师的职责说明(合集)
高级web前端开发工程师的职责说明1 职责: 1、根据需求文档,完成PC端、移动端页面及交互的开发,并保证兼容性和确保产品具有优质的用户体验; 2、熟练使用 HTML 、 CSS 、 JS 、 Ajax 等技术,能解决各种浏览器兼容性问题ÿ…...
powerdesigner各种字体设置;preview字体设置;sql字体设置
1.设置左侧菜单: 步骤如下: tools —> general options —> fonts —> defalut UI font ,选择字体样式及大小即可,同下图。 2.设置preview字体大小(sql预览) 步骤如下: tools —> general o…...
MyBatis查询数据库(4)
前言🍭 ❤️❤️❤️SSM专栏更新中,各位大佬觉得写得不错,支持一下,感谢了!❤️❤️❤️ Spring Spring MVC MyBatis_冷兮雪的博客-CSDN博客 终于到了MyBatis最后一篇,这篇讲的是动态SQL的使用。 复杂情…...
Python3 处理PDF之PyMuPDF 入门
PyMuPDF 简介 PyMuPDF是一个用于处理PDF文件的Python库,它提供了丰富的功能来操作、分析和转换PDF文档。这个库的设计目标是提供一个简单易用的API,使得开发者能够轻松地在Python程序中实现PDF文件的各种操作。 PyMuPDF的主要特点如下: 跨平台兼容性&a…...
使用隧道HTTP时如何解决网站验证码的问题?
使用代理时,有时候会遇到网站验证码的问题。验证码是为了防止机器人访问或恶意行为而设置的一种验证机制。当使用代理时,由于请求的源IP地址被更改,可能会触发网站的验证码机制。以下是解决网站验证码问题的几种方法: 1. 使用高匿…...
Java超级玛丽小游戏制作过程讲解 第三天 创建并完成常量类02
public class StaticValue {//背景public static BufferedImage bgnull;public static BufferedImage bg2null;//马里奥向左跳跃public static BufferedImage jump_Lnull;//马里奥向右跳跃public static BufferedImage jump_Rnull;//马里奥向左站立public static BufferedImage…...
ARM微架构
一、流水线 二、指令流水线 指令流水线 指令流水线 指令流水线 ARM指令流水线 ARM7采用3级流水线 ARM9采用5级流水线 Cortex-A9采用8级流水线 注1:虽然流水线级数越来越多,但都是在三级流水线的基础上进行了细分 PC的作用(取指) …...
Stable Diffusion AI绘画学习指南【本地环境搭建win+mac】
一、硬件配配置要求 系统:windows 10 / Mac os 硬盘:C 盘预留 15GB 以上,其他盘 50GB 以上,Stable Ddiffusion的很多大模型都是以 GB 起步。 显卡:4GB 以上,建议 8GB, 效率高,能玩大尺寸的图 CPU&…...
Unity 3D ScrollRect和ScrollView回弹问题的解决
你是否是这样? Content高度 < 全部Cell加在一起的总高 他就认为你的全部Cell加起来就跟Content一样大,所以才出现了这种完全回弹 我该怎么办? 很简单,改变Content的长度跟所有Cell的和一样大 void RefreshSize(){float allD…...
python编写小程序有界面,python编写小程序的运行
大家好,小编为大家解答python编写小程序怎么看代码的的问题。很多人还不知道python编写小程序的运行,现在让我们一起来看看吧! Python第一个简单的小游戏 temp input("请猜一猜姐姐的幸运数字是: ") guess int(temp) …...
【中断机制】什么是中断?使用中断的原因、注意事项
目录 一、为什么需要中断 二、什么是中断 1、中断的概念 2、中断的分类 3、中断的处理流程 三、中断处理程序要少用延时的原因 一、为什么需要中断 以网卡为例,CPU 如果要从网卡获取数据,不可能时时盯着网卡啥时候会有数据。当网卡收到数据时&…...
C++20 协程(coroutine)入门
文章目录 C20 协程(coroutine)入门什么是协程无栈协程和有栈协程有栈协程的例子例 1例 2 对称协程与非对称协程无栈协程的模型无栈协程的调度器朴素的单线程调度器让协程学会等待Python 中的异步函数可等待对象M:N 调度器——C# 中的异步函数 小结 C20 中…...
2023.8.6
2022河南萌新联赛第(三)场:河南大学\区间操作.cpp //题意:定义一个f[x]函数表示一个数分解质因数后各个质因子的幂次和,给定一个长度为n的数组, //有m个操作,第一种操作是输出[l, r]范围内的a…...
kubernetes网络之网络策略-----Network Policies - Default
默认情况下,如果名称空间中没有配置 NetworkPolicy,则该名称空间中,所有Pod的所有入方向流量和所有出方向流量都是被允许的。 那么如果我们想改变名称空间中默认的网络策略,又该怎么做呢? 默认拒绝所有的入方向流量 …...
奥威BI系统|秒分析,更适合分析大数据
根据以往的经验,当数据量多到一定程度就容易导致系统卡顿、崩溃。这种现象给企业级数据分析造成了极大的困扰。随着业务发展扩大和分析需求精细化,企业需要一套能秒分析大数据的系统。而奥威BI系统就是这样一款可以秒分析大数据的商业智能系统。 奥威BI…...
安全作业-Race竞争型漏洞、原型链污染
1.race漏洞一直卡在虚拟机安装上(待研究) 2.原型链污染 一、第一题js代码 const express require(express) var hbs require(hbs); var bodyParser require(body-parser); const md5 require(md5); var morganBody require(morgan-body); const app express(); var use…...
对微服务网关的一些总结
对微服务网关的一些总结 一. 什么是网关 网关是位于NGINX(或没有)与真实微服务间的转发服务。 用户通过HTTP接口,连接到NGINX,然后NGINX反向到M个网关。 网关根据[服务注册与发现],进行转发请求到具体的微服务上。 由于网关可编码&#…...
该选择WPF 还是 Winform?
WPF和WinForms都是.NET平台下的桌面应用程序开发框架,它们各有特点,适用于不同的场景和需求。下面是对WPF和WinForms的一些比较和优劣势:WPF(Windows Presentation Foundation):WPF具有强大的图形渲染能力&…...
概念解析 | ChatGPT技术概览
注1:本文系“概念解析”系列之一,致力于简洁清晰地解释、辨析复杂而专业的概念。本次辨析的概念是:ChatGPT技术概览 参考资料:Deng J, Lin Y. The benefits and challenges of ChatGPT: An overview[J]. Frontiers in Computing and Intelligent Systems, 2022, 2(2): 81-83. …...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...
回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...
快刀集(1): 一刀斩断视频片头广告
一刀流:用一个简单脚本,秒杀视频片头广告,还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农,平时写代码之余看看电影、补补片,是再正常不过的事。 电影嘛,要沉浸,…...
GO协程(Goroutine)问题总结
在使用Go语言来编写代码时,遇到的一些问题总结一下 [参考文档]:https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现: 今天在看到这个教程的时候,在自己的电…...
通过MicroSip配置自己的freeswitch服务器进行调试记录
之前用docker安装的freeswitch的,启动是正常的, 但用下面的Microsip连接不上 主要原因有可能一下几个 1、通过下面命令可以看 [rootlocalhost default]# docker exec -it freeswitch fs_cli -x "sofia status profile internal"Name …...
