问题标签 [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.
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.cpp
。struct ASGCT_CallTrace
是传递给 的参数之一,AsyncGetCallTrace
因此我确实需要创建它,但我不知道如何为其字段获取正确的值:JNIEnv *env_id
、jint num_frames
和JVMPI_CallFrame *frames
。此外,我不知道传递给的第三个参数AsyncGetCallTrace (void* ucontext)
应该是什么?
上述问题是我遇到的主要问题。但是,我面临的其他问题包括:
SIGPROF
计时器似乎并没有以指定的时间间隔准确地引发,而是不那么频繁。也就是说,如果我将计时器设置为每秒发送SIGPROF
一次(1 秒,0 微秒),那么在 5 秒的运行中,我得到的处理程序输出少于 5 个SIGPROF
(通常为 1-3 个)SIGPROF
Thread.sleep
在 Java 代码中,处理程序输出根本不会出现。因此,如果SIGPROF
要每秒发送 a ,并且我有Thread.sleep(5000);
,则在执行该代码期间将不会获得任何处理程序输出。
任何帮助,将不胜感激。其他详细信息(以及部分代码和示例输出)将根据要求发布。
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 转换为源代码行号,请提供帮助!
[如果有人很了解这个领域,请告诉我,因为我还有一些关于这个过程的问题要问。]
java - 如何在运行 testng 时进行编程分析
我打算围绕一组回归测试用例进行一些分析。我的想法是围绕 testng 方法利用 AOP,这将调用一些分析工具 api 并在测试用例执行结束时打印分析数据。我想在测试执行期间记录创建的对象数量、使用的内存等数据。
只是想知道是否有一个开源分析器 API 可以帮助我获取数据?我查看了 JMVTI,但不确定它是否可以提供我正在查看的信息。此外,它需要通过命令行部署和调用代理。
任何指针将不胜感激。
谢谢
java - 我可以以编程方式找出实例所在的 GC 代吗?
这个问题的范围仅限于HotSpot 世代。有没有办法以编程方式找出特定实例存在于哪一代。数据如:
- 年轻一代还是老一代?
- 如果年轻,哪个幸存者空间?
- 在 TLAB 内部?哪个线程?
只要我能做这样的事情,任何技术(例如,BTrace,JVMTI )都可以工作:
乞丐不能成为选择者,但理想情况下,我还可以了解感兴趣的实例何时从一代转移到另一代(即,基于事件回调——对轮询中隐含的延迟和开销不感兴趣。)
对没有正当理由只说“不”的答案不感兴趣:)
java - 如何监控其他 Java 应用程序产生的异常或错误?
我想找到或开发一个可以作为守护进程运行的应用程序,当主机上运行的 Java 应用程序出现任何异常或错误时,通过电子邮件或短信通知管理员。我知道JVMTI可以实现我的部分目标,但它会影响被监控应用程序的性能(我不知道会影响多少,如果它是轻微的可以接受),而且开发似乎是一个麻烦的工作一个 JVMTI 代理,我不确定如果多个应用程序同时使用同一个代理运行会发生什么。有没有更好的解决方案?提前致谢。
java - JVMTI _jclass toString
如何获取 JVM TI _jclass 的名称?我想显示在 JVMTI 代理中加载的类的名称,但是对我来说如何从 _jclass 实例中获取类的名称并不明显。
java - Java 代理、检测和数组创建
我需要为我的 java 应用程序编写一个代理,它在每次创建数组时都会做一些特定的事情。到目前为止,我无法找到在此事件上运行我的代码的任何方法。
- java.lang.instrument.ClassFileTransformer 没有得到“数组类”,因此无法挂钩到“数组的构造函数”。并且“数组类永远不可修改”
- 没有 JVMTI 事件对应于此
有什么建议么?
java - JVMTI 之上的 Java API?
我可以在 JVMTI 之上使用一个不错的 Java API 吗?
java-native-interface - 从 JNI jclass 确定 Java 类大小
我正在使用 JNI 来分析一些程序。我只是想知道,在获得 jclass 参考之后,如何找到底层类的大小?
例如:class cls = env->FindClass("Lee/Boehm/Test");
从这里我如何评估热点堆内 Lee.Boehm.Test 类的大小?
谢谢博姆
java - JVM TI 的链接库名称
我正在尝试在 Mac OS X 上编写 JVM TI 示例代理。我安装了 Java 5。我想知道我应该将我的示例代理代码链接到哪个动态库?