Tag: jvmti

如何监视其他Java应用程序生成的exception或错误?

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

启用JVMTI *function*以查询局部变量的开销

我正在研究一种在JVM上运行的简单动态语言。 其中一个必需的function是: 只有在抛出exception时 ,我才能在抛出exception时查询调用堆栈中所有帧的局部变量。 标准Java或reflection中不提供此function。 因此,我正在考虑以下想法: 在C中编写一个简单的JVMTI共享对象 在Java-land中抛出exception时,触发JVMTI函数 JVMTI lib中的代码暂停抛出exception的Java线程,检查堆栈以提取本地,将它们存储在可访问的位置,并恢复Java线程 除了在这种情况下,JVMTI根本不会被使用。 代码可能会运行几天而不会抛出exception,我希望它的运行速度与非启用JVMTI的代码一样快。 所以我的问题是 :在主流的JVM实现( 即 Oracle)中,启用我需要的JVMTIfunction的开销是多少? 例如,这样做会禁用JIT吗? 我对JVMTI“能力”的最佳猜测是: can_signal_thread can_get_source_file_name can_get_source_debug_extension can_access_local_variables

无法重新定义类当我尝试重新转换类时

我试图动态修改类,例如在行之前调用sleep()。 我在运行时使用Attach方法Attach代理程序Attach到jvm。 然后我从jvm获得了目标类,并对其进行了修改(添加一行来调用sleep() )。 我得到了redine类错误。 我使用的是JDK1.6。 我正在使用ASM核心API来修改类。 错误: Caused by: java.lang.UnsupportedOperationException: class redefinition failed: attempted to change the schema (add/remove fields) at sun.instrument.InstrumentationImpl.retransformClasses0(Native Method) at sun.instrument.InstrumentationImpl.retransformClasses(InstrumentationImpl.java:124) ASM代码有问题吗? 实际上我的ASM代码完成了它的工作(添加一行来调用sleep() )。 当前的jvm不支持转换类吗? 似乎无法执行retransformClasses() 。 retransformClasses()不支持ASM操作(在方法中添加一行来调用sleep() )? 有任何想法吗? 谢谢 编辑:我要修改的类: import java.util.concurrent.TimeUnit; public class Person { public String name = “abc”; public String address = “xxxxx” ; public […]

使用Java或JVMTI标识当前的JVM

我想确定当前运行的JVM。 在JVMTI文档中描述的函数的最佳情况下,但我找不到任何东西。 我的意思是这样的: VirtualMachine.list()提供: [sun.tools.attach.WindowsAttachProvider@46ae506e: 2440 de.fu.profiler.view.MainFrame… 但它显示所有JVM,而不是当前正在运行的JVM。

尝试重新转换类时得到“UnsupportedOperationException”

JDK1.6,动态修改jvm中加载的类。 当我评论代码时: classReader.accept(classAdapter, ClassReader.SKIP_DEBUG); , “UnsupportedOperationException”exception消失。 实际上,为了测试我的代码,我没有修改任何字段或方法。 但是程序在调用retransformClasses()之后捕获exception”UnsupportedOperationException” 。 有没有类似的例外? 可以给我一些建议吗? 代码如下: public byte[] modifySleepMethod() throws Exception { System.out.println(“Call modifySleepMethod”); ClassReader classReader = new ClassReader(classfileBuffer); System.out.println(“new classreader”); ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_MAXS); System.out.println(“new classwriter”); ClassAdapter classAdapter = new ModifyMethodClassAdapter(classWriter); classReader.accept(classAdapter, ClassReader.SKIP_DEBUG); byte[] classFile = null; classFile = classWriter.toByteArray(); FileOutputStream fos; try { fos = new […]

如何在当前机器上运行jvms

想象一下:两个Java项目可以在JDK1.5和JDK1.6上运行。两个可以在JDK 1.7上运行。 如何获取正在运行的jvm名称,pids和项目名称。 结果应该看起来像: pid 1234,projec_tname prj1,java_version JDK1.6 pid 4354,projec_tname prj2,java_version JDK1.5 pid 6234,projec_tname prj3,java_version JDK1.7 pid 9034,projec_tname prj4,java_version JDK1.7 解决方案是否有一个Java库在当前机器上搜索JVM? 是在当前机器中找不到运行的JDK。 我的问题没有帮助。 有任何想法吗?

Java JVMTI不能与-Xdebug -Xrunjdwp一起使用

我花了最后4个小时尝试在必须远程运行的Tomcat实例上设置Eclipse TPTP内存分析(即不在Eclipse中)。 根据TPTP和代理控制器文档,这应该是可能的。 我根据网站上的说明将TPTP组件(4.6.0)安装到我的Eclipse(Galileo)工作台以及代理控制器中。 为了启用代理,我在启动Tomcat实例的命令行中添加了以下选项: -agentlib:JPIBootLoader=JPIAgent:server=enabled;HeapProf:allocsites=true 并将以下目录添加到PATH的前面: D:\dev\tools\ac\plugins\org.eclipse.tptp.javaprofiler D:\dev\tools\ac\bin 尝试启动Tomcat时,我始终收到以下错误消息: ERROR: JDWP unable to get necessary JVMTI capabilities. [“debugInit.c”,L279] 我做了很多谷歌搜索,但发现没有相关性; 我尝试重新安装TPTP和各种版本的代理控制器。 最后问题结果是我用“jpda”选项启动Tomcat,catalina.bat转换为 -Xdebug -Xrunjdwp:transport=….. 删除“jpda”命令参数导致JVMTI开始工作。 所以,问题是:我在任何搜索过程中都没有发现任何内容,表明JVMTI代理与调试不兼容。 有人可以解释发生了什么以及为什么JVMTI + JDWP不是有效的设置?

当Java应用程序开始执行时,这些线程是什么?

我创建了一个简单的Java应用程序,它有一个JFrame和几个JButtons。 当我尝试使用JVMTI检查java应用程序时,我发现虽然我没有创建任何显式线程但是它们中有很多产生。 我可以找到以下主题: DestroyJavaVM AWT-EventQueue的 – 0 AWT关断 AWT-XAWT-守护程序线程 Java2D Disposer-守护程序线程 Thread-0-守护程序线程[由JVMTI代理创建] Signal Dispatcher-守护程序线程 敲定 – 守护程序线程 参考处理程序 – 守护程序线程 他们中的大多数都处于Runnable状态。 有人能告诉我这些线程的function吗?

在运行时卸载JVMTI代理?

我正在使用attach API在运行时加载JVMTI代理。 我想在程序完成时卸载JVMTI代理而不终止代理加载的JVM。根据此文档 ,无法通过attach API执行此操作。 是否还有其他方法可以强制代理通过Java API或JVMTI代理程序卸载其自身?

Java:你如何使用JVMTI的ForceGargabeCollection强制GC?

我不是在寻找通常的“你只能使用System.gc()回答提示使用Java的GC”,这根本不是什么问题。 我的问题不是主观的,而是基于现实:GC 可以用Java来强制实现。 我们每天使用的许多程序都是这样做的:IntelliJ IDEA,NetBeans,VisualVM。 他们都可以强制 GC发生。 怎么做? 我认为他们都使用JVMTI,更具体地说是ForceGarbageCollection (注意“Force”),但我怎么能为自己尝试呢? http://java.sun.com/javase/6/docs/platform/jvmti/jvmti.html#ForceGarbageCollection 还要注意,这个问题不是关于“为什么”我想要这样做:“为什么”可能是“好奇心”或“我们正在编写类似于VisualVM的程序”等。 问题实际上是“你如何使用JVMTI的ForceGarbageCollection强制GC”? 是否需要使用任何特殊参数启动JVM? 是否需要任何JNI? 如果是这样,究竟是什么代码? 它只适用于Sun VM吗? 任何完整和可编辑的例子都是最受欢迎的。