问题标签 [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 投票
4 回答
436 浏览

java - 用于在 Java 中分析并发程序行为的功能

现在有一些分析器承诺分析程序执行的并发行为以了解线程执行。

我是一个集合特性,这对于只专注于分析并发性的 Java 分析器很有用:

到目前为止我收集的内容:

  • 构建等待图以检测潜在的死锁

  • 访问资源(数据结构等)的时间测量

  • 显示每个线程的状态(活动、中断、死亡)

  • 哪个线程调用哪个线程来访问共享资源(等待、阻塞等)

你有什么想法?就我个人而言,我的目标是在处理 Java 并发时揭示一些不良的编程习惯。

0 投票
2 回答
256 浏览

qt - 使用 Qt/qmake 构建 JVMTI 代理

在我成功实现我的第一个 JVMTI 代理并使用 g++ 编译器完成构建后,我想将构建过程集成到我的 Qt 项目中。

但是我面临一些构建过程配置问题:

我将使用 g++ 编译器运行的参数如下所示:

这很好用。现在到 qmake:

我知道参数 CXXFLAGS 可以向 qmake 使用的 C++ 编译器添加更多参数,但是如何将此参数化编译器调用转换为 qmake?

0 投票
1 回答
394 浏览

java - JVMTI 代理之上的 GUI

我计划使用 Oracle 提供的 JVMTI API 来开发探查器。对于可视化,我想在代理代码之上实现一个 GUI(Qt 框架)。我的第一个 jvmti 代理正在编译和运行,我开始将代理集成到我的 Qt 项目中。

现在我面临如何将代理与 GUI 耦合的问题。GUI 应该在代理内部启动吗?例如在 Agent_OnLoad 函数中?

一个长期的方法是从 GUI 开始分析,尽管我无法想象如何实现这一点。

0 投票
2 回答
432 浏览

java - 重新初始化 Java 类

我们正在开发一个 JVMTI Java 代理,它用于检测 java 类文件。其中一小部分(显然)是本机 C++ 代码,但大部分是 Java 代码,它通过网络加载并从本机代理代码调用。我们使用代码覆盖率工具来收集 java 部分的测试覆盖率,该部分执行源代码检测。

现在,当我们的代理启动时,一些类被初始化,特别是 java.lang.ref.Reference,它启动了一个线程。我们的代理使用自定义 java 代码检测线程启动方法,该代码由代码覆盖工具检测。覆盖工具在我们的 java 代理代码中放置了一些带有静态初始化器的静态内部类,因此这是由于 java.lang.ref.Reference 被初始化而执行的。

问题是,此时(当 java.lang.ref.Reference 被初始化时),JVM 的一些基本功能还没有到位。具体来说,代码覆盖工具初始化程序想要访问 System.getProperty(String name),但 System.props 仍然为 null,因此调用会导致 NullPointerException。这导致代码覆盖工具的静态内部类未初始化,类处于initialization_error状态,结果为NoClassDefFoundError。对此类的每次后续访问都会导致 NoClassDefFoundError。

我现在的意图是忽略这个初始初始化错误,等到 VM_Start 然后将相关类的 ClassState 重置为“链接”。这样我希望JVM在后续访问该类时会尝试再次初始化该类。

有没有人知道,如果这可以从 JVMTI 代理完成,并给我一些建议如何做到这一点?

0 投票
1 回答
1300 浏览

c++ - 使用g ++共享库中的未定义符号

使用 JVMTI,我正在开发一个代理来分析 Java 应用程序。因此编译了一个共享库 libagent.so。此外,我使用 Qt 框架:

目前它仅由以下两个源文件组成: agent.cppagentserver.cpp

但是,当使用我的共享库 libagent.so 启动 Java 应用程序时,出现错误:未定义符号:_ZTV11AgentServer (./libagent.so)

当我运行 ldd 时,我遇到了同样的依赖问题:

我当前的编译命令是:

其中 $(CXXFLAGS) 是 -m64 -pipe -O2 -Wall -W -D_REENTRANT $(DEFINES)

其中 $(DEFINES) 是 -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -DQT_SHARED

其中 $(INCPATH) 是 -I/home/konrad/qtsdk-2010.05/qt/mkspecs/linux-g++-64 -I../src -I/home/konrad/qtsdk-2010.05/qt/include/QtCore -I /home/konrad/qtsdk-2010.05/qt/include/QtNetwork -I/home/konrad/qtsdk-2010.05/qt/include/QtGui -I/home/konrad/qtsdk-2010.05/qt/include -I/usr/lib /jvm/java-6-openjdk/include -I/usr/lib/jvm/java-6-openjdk/include/linux -I。-我。-I../src -I.

我花了一些时间研究这个问题,但没有一个解决这个错误。


这是agentserver.cpp的头代码:agentserver.h

0 投票
5 回答
7067 浏览

java - 用 Java 或 JVMTI 识别当前 JVM

我想确定当前正在运行的 JVM。在JVMTI 文档中描述的函数的最佳情况下,但我找不到任何东西。


我的意思是这样的:VirtualMachine.list()提供:

但它显示所有 JVM,而不是当前正在运行的 JVM。

0 投票
2 回答
558 浏览

java - 用 JVMTI 分析 JVM,如何区分不同的 JVM?

我正在借助 JVM TI 编写分析器。

在 C++ 中,我编写了一个简单的代理,它将收集到的信息写入套接字。使用 Java Swing,我构建了一个简单的 GUI,它从套接字读取这些数据以将其可视化。

但是我面临一些可用性问题。我想提供功能以根据请求开始分析 Java 应用程序。附加 API提供了将代理注入到正在运行的JVM 中的可能性。

但是要启动一个新的 Java 程序并注入代理就有点复杂了。一种方法是调用命令行并从 GUI Profiler 启动 Java 程序:

我有点不喜欢这个想法,因为它有点老套,但我看不到其他方法,是吗?

总结一下,我需要两种方法来开始分析 JVM:

  1. 从头开始一个 Java 应用程序并直接开始分析它
  2. 附加到正在运行的 JVM 并注入代理以开始对其进行分析

此外,我需要区分我检查的不同 JVM,但如何做到这一点?不同的 JVM 没有唯一标识符。Attach API提供了列出不同 JVM 及其名称id的可能性,但在第一种情况下该怎么办?是否可以使用参数注入代理?

0 投票
1 回答
130 浏览

java - 类 ThreadInfo 提供的信息是否比 JVMTI 提供的信息多?

这令人困惑。ThreadInfo类提供了大量信息,尤其是线程的统计信息。但是我在JVMTI中找不到这样的函数。这是常态吗?我必须自己收集数据吗?我必须自己迭代到 ThreadInfo 对象吗?

0 投票
1 回答
184 浏览

java - JVMTI API 中没有同步统计信息?

java.lang.ThreadInfo类提供了一些非常有用的方法,这些方法提供有关 Java 同步的统计信息。例如:

getBlockedTime() 返回自从启用线程争用监视以来,与此 ThreadInfo 关联的线程已阻止进入或重新进入监视器的近似累积经过时间(以毫秒为单位)。[...]

getWaitedCount() 返回与此 ThreadInfo 关联的线程等待通知的总次数。[...]

我找不到从JVMTI API访问这些信息的函数。我会忽略它还是必须自己收集这些信息?


除了同步统计之外,似乎您甚至无法获得线程 id,可以通过使用Thread.currentThread().getId();

0 投票
0 回答
346 浏览

java - JVMTI 代理从不返回线程状态终止

实现 JVMTI 代理,我读取了某些事件的线程状态,例如 ThreadStart、ThreadEnd、VMInit、VMDeath 等。但是,我注意到,线程状态永远不会是新的或终止的,而是始终可运行、等待等。

可能是有原因的,ThreadEnd 只是线程终止的一个信号。我读了所有的线程GetAllThreads,上面写着:

获取所有实时线程。线程是 Java 编程语言线程;也就是说,附加到 VM 的线程。如果 java.lang.Thread.isAlive() 返回 true,则线程处于活动状态,即线程已启动且尚未终止。线程的范围由 JVM TI 环境的上下文决定,它通常是附加到 VM 的所有线程。请注意,这包括 JVM TI 代理线程(请参阅 RunAgentThread)。

这意味着,即使我在 VMDeath 事件中调用它,我也不会获取已终止的线程。但是我应该这样做以使州终止的吗?

我猜:

  • 在事件 ThreadEnd 上,我返回手动终止的状态
  • 在对象分配上,如果是线程,我手动返回状态 new

PS:我正在阅读 JVMTI API 建议的线程状态