问题标签 [jvmti]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2886 浏览

asynchronous - 如何正确编写调用 AsyncGetCallTrace 的 SIGPROF 处理程序?

我正在编写一个简短的分析器(用 C 语言),它旨在定期打印出各种 Java 客户端中线程的堆栈跟踪。我必须使用未记录的函数AsyncGetCallTrace而不是GetStackTrace最小化入侵并允许堆栈跟踪而不管线程状态如何。该函数的源代码可以在这里找到:http: //download.java.net/openjdk/jdk6/promoted/b20/openjdk-6-src-b20-21_jun_2010.tar.gz in hotspot/src/share/vm/prims/forte.cpp。我发现了一些记录 JVMTI、信号处理和计时的手册页,以及一个详细介绍如何设置AsyncGetCallTrace调用的博客:http: //jeremymanson.blogspot.com/2007/05/profiling-with-jvmtijvmpi-sigprof -and.html

该博客缺少的是在信号处理程序中实际调用函数的代码(作者假设读者可以自己完成此操作)。我正在寻求帮助来做到这一点。我不确定如何以及在哪里创建struct ASGCT_CallTrace(和内部struct ASGCT_CallFrame),如上述文件中定义的那样forte.cppstruct ASGCT_CallTrace是传递给 的参数之一,AsyncGetCallTrace因此我确实需要创建它,但我不知道如何为其字段获取正确的值:JNIEnv *env_idjint num_framesJVMPI_CallFrame *frames。此外,我不知道传递给的第三个参数AsyncGetCallTrace (void* ucontext)应该是什么?

上述问题是我遇到的主要问题。但是,我面临的其他问题包括:

  1. SIGPROF计时器似乎并没有以指定的时间间隔准确地引发,而是不那么频繁。也就是说,如果我将计时器设置为每秒发送SIGPROF一次(1 秒,0 微秒),那么在 5 秒的运行中,我得到的处理程序输出少于 5 个SIGPROF(通常为 1-3 个)

  2. SIGPROFThread.sleep在 Java 代码中,处理程序输出根本不会出现。因此,如果SIGPROF要每秒发送 a ,并且我有Thread.sleep(5000);,则在执行该代码期间将不会获得任何处理程序输出。

任何帮助,将不胜感激。其他详细信息(以及部分代码和示例输出)将根据要求发布。

0 投票
1 回答
1360 浏览

code-analysis - 将 BCI(字节码索引)转换为源代码行号

我正在编写 JVMTI 代码来分析 Java 程序,这主要需要使用函数 AsyncGetCallTrace 以固定时间间隔从随机线程获取堆栈跟踪。因此,我能够获得 CallTrace 结构,每个结构都包含一个 CallFrame 结构数组,其中包含有关堆栈跟踪中各个帧的数据。具体来说,这些数据包括:jmethodID method_id(框架所在的java方法的ID)和:jint lineno(.class文件中方法的BCI,据我了解文档)。我似乎找不到使用 JVMTI 框架将此“lineno”转换为相应源代码行号的方法(请参阅文件 jvmti.h,至少位于 /usr/lib/jvm/java-6-sun/include 中在 Linux 上)。事实上,即使在 JVMTI 框架之外,http://jakarta.apache.org/bcel/apidocs/org/apache/bcel/classfile/LineNumberTable.html,但即使这样也可能不是我想要的,需要额外安装,并且需要我处理数据,由 C++ JMVTI 代码使用单独的 Java 程序生成。

如果有人知道如何从 JVMTI 中(甚至以任何方式)将 BCI 转换为源代码行号,请提供帮助!

[如果有人很了解这个领域,请告诉我,因为我还有一些关于这个过程的问题要问。]

0 投票
1 回答
499 浏览

java - 如何在运行 testng 时进行编程分析

我打算围绕一组回归测试用例进行一些分析。我的想法是围绕 testng 方法利用 AOP,这将调用一些分析工具 api 并在测试用例执行结束时打印分析数据。我想在测试执行期间记录创建的对象数量、使用的内存等数据。

只是想知道是否有一个开源分析器 API 可以帮助我获取数据?我查看了 JMVTI,但不确定它是否可以提供我正在查看的信息。此外,它需要通过命令行部署和调用代理。

任何指针将不胜感激。

谢谢

0 投票
2 回答
639 浏览

java - 我可以以编程方式找出实例所在的 GC 代吗?

这个问题的范围仅限于HotSpot 世代。有没有办法以编程方式找出特定实例存在于哪一代。数据如:

  • 年轻一代还是老一代?
  • 如果年轻,哪个幸存者空间?
  • 在 TLAB 内部?哪个线程?

只要我能做这样的事情,任何技术(例如,BTraceJVMTI )都可以工作:

乞丐不能成为选择者,但理想情况下,我还可以了解感兴趣的实例何时从一代转移到另一代即,基于事件回调——对轮询中隐含的延迟和开销不感兴趣。)

对没有正当理由只说“不”的答案不感兴趣:)

0 投票
6 回答
2295 浏览

java - 如何监控其他 Java 应用程序产生的异常或错误?

我想找到或开发一个可以作为守护进程运行的应用程序,当主机上运行的 Java 应用程序出现任何异常或错误时,通过电子邮件或短信通知管理员。我知道JVMTI可以实现我的部分目标,但它会影响被监控应用程序的性能(我不知道会影响多少,如果它是轻微的可以接受),而且开发似乎是一个麻烦的工作一个 JVMTI 代理,我不确定如果多个应用程序同时使用同一个代理运行会发生什么。有没有更好的解决方案?提前致谢。

0 投票
2 回答
645 浏览

java - JVMTI _jclass toString

如何获取 JVM TI _jclass 的名称?我想显示在 JVMTI 代理中加​​载的类的名称,但是对我来说如何从 _jclass 实例中获取类的名称并不明显。

0 投票
1 回答
646 浏览

java - Java 代理、检测和数组创建

我需要为我的 java 应用程序编写一个代理,它在每次创建数组时都会做一些特定的事情。到目前为止,我无法找到在此事件上运行我的代码的任何方法。

  1. java.lang.instrument.ClassFileTransformer 没有得到“数组类”,因此无法挂钩到“数组的构造函数”。并且“数组类永远不可修改”
  2. 没有 JVMTI 事件对应于此

有什么建议么?

0 投票
6 回答
5166 浏览

java - JVMTI 之上的 Java API?

我可以在 JVMTI 之上使用一个不错的 Java API 吗?

0 投票
2 回答
1112 浏览

java-native-interface - 从 JNI jclass 确定 Java 类大小

我正在使用 JNI 来分析一些程序。我只是想知道,在获得 jclass 参考之后,如何找到底层类的大小?

例如:class cls = env->FindClass("Lee/Boehm/Test");

从这里我如何评估热点堆内 Lee.Boehm.Test 类的大小?

谢谢博姆

0 投票
2 回答
147 浏览

java - JVM TI 的链接库名称

我正在尝试在 Mac OS X 上编写 JVM TI 示例代理。我安装了 Java 5。我想知道我应该将我的示例代理代码链接到哪个动态库?