我目前正在为Java1.7构建nativeJVMTI代理。问题是我需要索引一些关于特定Java对象实例的数据。所以我的问题是我可以使用jobject类型的值作为对象的实例ID来检索我的索引数据吗?我已经在寻找关于什么是jobject类型的语义的任何信息。它是对象内存位置的指针吗?它是堆栈指针地址吗?它是JVM内部结构的地址吗?所以我无法确定jobject的值在Java对象的生命周期中是否是唯一且不可变的。感谢您的帮助。编辑根据JNI的规范找到here,jobject似乎是指向Object实例的指针。 最佳答案 当您说“jobject
我正在寻找潜在的JDIAPI,以便在JVM执行期间的任意点暂停JVM。看着BreakPointRequestcreateBreakpointRequest方法需要一个特定的位置。是否有任何其他API不需要位置或以某种方式获取可以传递以创建断点的当前位置。我基本上是在寻找一种方法来附加和暂停应用程序,然后使用JVMTI代理接收BreakPoint事件的回调以执行进一步处理。谢谢 最佳答案 断点只对源代码中的某个位置有意义。任意暂停您的应用程序可能最好通过暂停当前在JVM中运行的所有线程来完成。看看SuspendThreadList()
我想知道是否可以在不更改应用程序代码的情况下记录在JVM级别发生的每个异常?对于每个异常,我的意思是捕获和未捕获的异常......我想稍后分析这些日志并按异常类型(类)对它们进行分组,并简单地按类型计算异常。我正在使用HotSpot;)也许为什么这样做更聪明?例如,通过任何免费的分析器(YourKit有但不是免费的)?我认为JRockit在管理控制台中有异常计数器,但没有看到HotSpot的任何类似内容。 最佳答案 我相信有免费的工具可以做到这一点,但即使是制作自己的工具也很容易。JVMTI会有帮助。这是我为跟踪所有异常而创建的一个
我正在尝试跟踪JVM中所有对象的分配情况。在关于分配分析器的几个文档中提到最简单的方法是这样的:添加invokestaticTracker.trackAllocation()V指令java/lang/Object.(通常它由一条return指令组成,我们在它前面加上invokestatic,所以现在是2条指令)。(我知道这种方法很慢并且不会跟踪数组分配,但我想从最简单的解决方案开始。而且我不会将对分配对象的引用传递给跟踪器,但这将在稍后添加。)类文件在onClassLoadedHook中使用JVMTI代理进行检测。但是,添加invokestatic之后指令JVM因段错误而崩溃。Trac
是否可以使用JNIAPI从JNI方法中创建JVM?我尝试使用JNI函数“JNI_CreateJavaVM()”来执行此操作,但它不起作用(该函数一直返回小于零的值)。这是我使用的基本代码(C++):JNIEnv*env;JavaVM*jvm;jintres;#ifdefJNI_VERSION_1_2JavaVMInitArgsvm_args;JavaVMOptionoptions[2];options[0].optionString="-Djava.class.path="USER_CLASSPATH;options[1].optionString="-verbose:jni";vm_
为了支持更好的分析数据,我希望我的JVMTI代理启用几个JVM标志。有问题的代理人是Honest-Profiler并且它只能在启动时加载。我想启用标志:-XX:+UnlockDiagnosticVMOptions-XX:+DebugNonSafepoints根据记录的问题here如果标志没有打开,我们会得到一个有偏见的配置文件。最好不要警告用户而只启用标志。 最佳答案 至于DebugNonSafepoints,您甚至不需要设置此标志。看debugInfoRec.cpp:staticinlineboolcompute_recordin
.NET有几个方便的注释,指示调试器单步执行/越过某些方法。我想知道是否有适用于Java平台的等效项。例如:@DebuggerStepThroughpublicvoidfoo(){..}会导致调试器在单步执行时不在foo中停止。我尝试了什么在类文件中使用SYNTHETIcflags。这会导致javac禁止用户代码调用此类方法。自定义属性。没有JDIAPI检索注释。在thisforum上也提到了.附言。我正在实现一个调试器并控制发出的字节码 最佳答案 据我所知,不是股票特征,不是。否则,我还可以推荐您查看Eclipse调试器的“步进过
在java中有多种生成线程转储的方法。我想使用JVMTI(CAPI)来生成它,以评估它对正在运行的JVM的性能影响。(我知道jstack和JMX;这个问题通常不是关于获取线程转储,而是关于使用JVMTIAPI)。我的代码基于thisblogpost.在那里,java代理附加到SIGQUIT信号。我想避免这种情况,因为这与JVM用于将线程转储写入标准输出的信号相同。我想避免这种口是心非。换句话说,我想附加到不同的信号,或者找到一种方法让代理定期生成线程转储。 最佳答案 Inthere,thejavaagentattachestothe
此问题的范围仅限于HotSpotgenerations.有没有办法以编程方式找出特定实例生活在哪一代。数据如:年轻一代还是老一代?如果年轻,哪个幸存者空间?在TLAB内部?哪个线程?任何技术(例如,BTrace、JVMTI)都可以工作,只要我能做这样的事情:Objectx=newObject();HotSpotGenerationInfoinfo=HotSpotGenerationUtil.getInfo(x);乞丐不能成为选择者,但理想情况下,我还可以了解感兴趣的实例何时从一代转移到另一代在它发生的那一刻(即,基于事件回调-不感兴趣在轮询中隐含的延迟和开销。)对没有理由就说“不”的答
出于各种目的,我在运行时检测类文件。为此,我正在使用JVMTI代理。我检测方法的策略是调用RetransformClasses函数来调用ClassFileLoadHook。此策略适用于所有在检测后有任何进一步调用的方法,因为实际检测发生在后续函数调用时,但它不适用于任何没有进一步调用的方法,如main在程序中运行。我想在执行过程中即时检测方法。我想要一些程序,例如检测代码的堆栈替换(OSR)。JVMTI或任何其他方法中是否有可用的策略????PS:如果有帮助,我愿意编辑/修补OpenJDK源代码。 最佳答案 经过进一步思考,我相信您