- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正致力于将橡皮擦数据争用检测算法作为 JVMTI 代理来实现。当我尝试运行一些示例输入来测试我的代码时,JVM 崩溃,转储如下所示(也可能显示相同错误的其他堆栈跟踪):
native 方法中的 fatal error :在错误的线程中使用 JNIEnv
在 Proxy.monitor_enter_( native 方法)
在 Proxy.monitor_enter(Proxy.java:30)
在 ex1.LifeThreads.setNeighborThreadChange(LifeThreads.java:36)
在 ex1.LifeThreads.neighbor(LifeThreads.java:425)
在 ex1.LifeThreads.standardItr(LifeThreads.java:321)
在 ex1.LifeThreads.run(LifeThreads.java:462)
(这种事后跟踪可以通过 Sun JVM 的 -Xcheck:jni 选项获得)
在代码中,我执行了与各种 JDK 示例中所示的相同类型的检测(heapViewer、heapTracker 等,通过一些具有 native 方法的代理 java 类)。 Proxy.monitor_enter_
native 方法在每个 monitorenter
指令后调用。
这是 monitor_enter_ 的代码:
void native_monitor_exit(JNIEnv *jni, jclass klass, jthread thread_id, jobject obj)
{
scoped_lock( agent::instance()->jvmti(), agent::instance()->monitor_ );
if( agent::instance()->death_active_)
return;
std::string name = agent::instance()->thread_name( thread_id );
thread_t* thread = get_thread( thread_id );
if( thread == 0 )
return;
jobject global_ref = agent::instance()->jni()->NewGlobalRef( obj );
if( global_ref == 0 )
fatal_error("Out of memory while trying to create new global ref.");
logger::instance()->level(1) << "MONITOR ENTER"
<< "\n\t" << "jthread name= " << name
<< "\n\t" << "thread_t= " << thread << " " << *thread
<< "\n\t" << "monitor gl= " << global_ref
<< std::endl;
thread->lock( lock(global_ref) );
}
,其中 scoped_lock
基本上是 JVMTI Raw Monitor 进入/退出的作用域锁,thread_t
只是一个包装一些 std::vector
的结构,其中类 lock
的实例(它本身只是包装 jobject
全局引用 global_ref
) 被存储,当 thread->lock( lock(global_ref))
被调用时。
JVMTI 环境。在代理单例中全局缓存,而线程本地的 JNI env 每次在使用前都会重新加载(效率不高,但现在我不关心),如下所示:
JNIEnv* jni()
{
jint res;
JNIEnv* env = 0;
res = jvm()->GetEnv( (void**)&env, JNI_VERSION_1_2 );
if( res == JNI_EDETACHED )
{
res = jvm()->AttachCurrentThread( (void **)&env, 0 );
if( res != JNI_OK || env == 0 )
fatal_error( "ERROR: Unable to create JNIEnv by attach, error=%d\n", res );
}
else if( res != JNI_OK || env == 0 )
fatal_error( "ERROR: Unable to create JNIEnv, error=%d\n", res );
}
return env;
}
最佳答案
您应该使用传递给您的 native_monitor_exit
方法的 jni
参数,而不是在您的 jni()
方法中查找它,它是从 Java 调用方法时应该使用的 jni 环境。
关于java - JVMTI 代理崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7420806/
我想调试使用我编写的 jvmti 代理的 java 应用程序。这似乎仅在 jvmti 代理未尝试启用“can_generate_breakpoint_events”功能时才有效。 尝试启用断点功能并在
我正在使用 JVMTI 库编写一个 Java 原生代理,并尝试获得访问局部变量的能力。在 OnLoad 阶段加载代理时,可以启用该功能,但是在实时阶段(OnAttach)加载它时似乎不可能,当我尝试添
我正致力于将橡皮擦数据争用检测算法作为 JVMTI 代理来实现。当我尝试运行一些示例输入来测试我的代码时,JVM 崩溃,转储如下所示(也可能显示相同错误的其他堆栈跟踪): native 方法中的 fa
感谢 JVMTI 代理,我正在记录我的 Java 应用程序中的所有方法条目。现在,我能够获取每个方法的名称,但我希望能够获取该方法接收到的参数值。 此问题已在较早的主题中讨论过(参见 How to g
我有两个问题 redefineClasses 可以与支持 JIT 的 JVM 一起使用吗? 如果是这样,在多线程应用程序中,如果一个线程使用 redefineClasses 重新定义一个类,另一个线程
我想知道是否可以使用 JVMTI 动态检测 Java 中的死锁。有两个事件指示使用同步语句在监视器上执行的操作: 监控竞争输入 Sent when a thread is attempting to
我正在使用 JVM 工具界面。我正在尝试使用 SetSystemProperty() 调用在 Agent_OnLoad 事件中创建 SystemProperty。如果该属性存在,它会正确设置一个新值。
我注册了一个JVMTI Event MethodEntry,它的回调函数是tdMethodEntry 如果有很多MethodEntry 事件,我的问题是 these event will be pro
我试图通读整个 jvmti 文档,但没有找到解决问题的方法。 我想获取在命令行中用于调用程序的类/文件的名称: java -agentpath: 在大写的情况下,我想获取 的名称。 GetSour
使用 MethodEntry和 MethodExit JVMTI 提供的事件 Hook 如何测量在 Java 中执行的方法的时间? 简单来说就是:time2 - time1但我看到的问题是,如何区分不
如何获取JVM TI _jclass的名称?我想显示 JVMTI 代理中加载的类的名称,但是我不清楚如何从 _jclass 实例获取类的名称。 最佳答案 这是你想要的吗? #include #i
我打算使用 Oracle 提供的 JVMTI API 开发一个分析器。对于可视化,我想在代理代码之上实现一个 GUI(Qt 框架)。我的第一个 jvmti agent 已经编译运行,我开始将它集成到我
出于各种目的,我在运行时检测类文件。为此,我正在使用 JVMTI 代理。我检测方法的策略是调用 RetransformClasses 函数来调用 ClassFileLoadHook。此策略适用于所有在
我正在使用附加 API 在运行时加载 JVMTI 代理。我想在我的程序完成时卸载 JVMTI 代理,而不终止加载代理的 JVM。根据 this documentation无法通过附加 API 执行此操
是否有可能获得完整的命令行以及用于启动当前 Java 进程并在 JVMTI 的 OnLoad 阶段获得的所有参数? 最佳答案 我咨询过JVMTI reference而且我认为它不是 native 提供
我部署了一个简单的 JVMTI 代理来测试字节码检测。我的策略是在 CompiledMethodLoad 回调中调用 RetransformClasses 函数来调用 ClassFileLoadHoo
编写分析我也会实现堆分析的典型任务。具体我想跟踪一下,哪个线程分配了多少数据?使用 JVMTI,我认为 Hook 到事件 VM Object Allocation 和 Object Free 就足够了
我正在使用 JVMTI 为 Java 应用程序编写一个检测工具。我已经看到 JVMTI 检测何时抛出异常以及何时根据 http://docs.oracle.com/javase/7/docs/plat
我们最近将一个网络应用程序(tomcat 5.5.x 网络应用程序)投入生产,它今天开始表现出奇怪的行为。我们在任何开发或预生产环境中都没有看到这种行为。 我们在运行时对生产系统的唯一看法是日志记录。
有没有我可以在 JVMTI 之上使用的不错的 Java API? 最佳答案 JVMTI 不是为在顶部安装 Java API 而构建的。 JVM TI 定义本身说: The JVM tool inter
我是一名优秀的程序员,十分优秀!