想必不少人听说过javaagent,但是很少人听说Instrumentation,其实Instrumentation就是javaagent的实现机制,说到Instrumentation,就必须想了解java的attach机制,那就先说下attach的实现。
大家进行jstack的时候,是不是经常看到两个线程Signal Dispatcher和 Attach Listener线程,可能不知道是干嘛的吧,这两个线程是实现attach的关键所在,其中前者是在jvm启动的时候就会创建的,后者只有接收过attach请求的时候vm才会创建,顾名思义,Signal Dispatcher是分发信号的, Attach Listener 是处理attach请求的,那么两者有什么关系呢,当我们执行attach方法的时候,会向目标vm发出一个SIGQUIT 的信号,目标vm收到这个信号之后就会创建Attach Listener线程了,当然jvm保证了不会多创建。
path = findSocketFile(pid); if (path == null) { File f = new File(tmpdir, ".attach_pid" + pid); createAttachFile(f.getPath()); try { sendQuitTo(pid); // give the target VM time to start the attach mechanism int i = 0; long delay = 200; int retries = (int)(attachTimeout() / delay); do { try { Thread.sleep(delay); } catch (InterruptedException x) { } path = findSocketFile(pid); i++; } while (i <= retries && path == null); if (path == null) { throw new AttachNotSupportedException( "Unable to open socket file: target process not responding " + "or HotSpot VM not loaded"); } } finally { f.delete(); } }
Attach机制说得简单点就是提供A进程可以连上B进程(当然是java进程),创建socket进行通信,A通过发命令给B,B然后对命令进行截取从自己的vm中获取信息发回给客户端vm,但是并不是随便发指令都会处理的,那么attach Listener接收哪些命令呢,如下所示
static AttachOperationFunctionInfo funcs[] = { { "agentProperties", get_agent_properties }, { "datadump", data_dump }, { "dumpheap", dump_heap }, { "load", JvmtiExport::load_agent_library }, { "properties", get_system_properties }, { "threaddump", thread_dump }, { "inspectheap", heap_inspection }, { "setflag", set_flag }, { "printflag", print_flag }, { "jcmd", jcmd }, { NULL, NULL } };
Instrumentation的实现其实主要使用了load这个指令,它用来实现让target vm动态加载agentlib,Instrumentation的实现在一个名为libinstrument.dylib的动态lib库,linux下是libinstrument.so,它是基于jvmti接口实现的,因此在对其进行load的时候会创建一个agent实例,并往jvmti环境注册一些回调方法,比如监听类文件加载的事件,vm初始化完成事件等,执行Agent_OnAttach,这里会创建一个Instrumentation实例并返回给用户供大家扩展Instrumentation,比如增加一些transform。并会执行Instrumentation实例的 loadClassAndCallAgentmain方法,该方法主要执行agent的MF文件里定义的 Agent-Class类的agentmain方法,当vm初始化完毕之后,会调用loadClassAndCallPremain方法,该方法主要执行agent的MF文件里定义的 Agent-Class类的pre main方法。在类进行加载的时候会调用Instrumentation的transform方法,可以看看参数里有个byte数组,这个数组其实就是正在加载的class字节码,所以如果要字节码增强在这里就可以入手啦,甚至可以实现偷天换日.
相关推荐
"浅谈 JVM 原理" JVM(Java Virtual Machine)是一种虚拟机,它可以模拟完整的硬件系统功能,运行在一个完全隔离的环境中,提供了一个完整的计算机系统。JVM 可以分为三类:VMWare、Visual Box 和 JVM。其中,...
《揭秘Java虚拟机-JVM设计原理与实现》这本书深入探讨了Java虚拟机(JVM)的工作原理及其在Java编程中的核心地位。Java虚拟机是Java平台的核心组成部分,它负责执行字节码,为开发者提供了跨平台的运行环境。以下是...
在这个简单的JVM实现中,`JVM.java`文件很可能是模拟了JVM的执行引擎部分。执行引擎负责解析和执行字节码,其核心操作就是堆栈操作。在Java字节码中,每条指令都会对操作数栈产生影响,比如`iadd`指令用于将栈顶的两...
"浅谈JAVA虚拟机JVM及工作原理" Java虚拟机(JVM)是Java语言的 runtime 环境,它提供了一个平台独立的环境,使得Java程序可以跨平台运行。JVM 的主要组件包括虚拟机栈、堆、方法区、程序计数器、本地方法栈等。 1...
Java JVM 调优浅谈 Java 虚拟机(JVM)是 Java 语言的核心组件之一,负责加载、验证、执行 Java 字节码。JVM 的调优对于 Java 程序的性能和稳定性至关重要。下面对 JVM 调优的相关知识点进行了详细的解释。 数据...
JVM通过解析.class文件中的字节码,将其转换为机器码,从而在本地操作系统上执行。理解JVM的工作机制对于优化Java应用程序性能至关重要。 二、开源项目的意义 开源项目“jvmjava”为开发者提供了一种学习JVM内部...
《OpenJDK中的JVM Hotspot实现源码解析》 在Java世界中,JVM(Java Virtual Machine)是运行Java程序的关键组件,它负责将字节码解释执行或即时编译为机器码,使得Java具备跨平台的能力。Hotspot是Oracle JDK和...
JVM(Java Virtual Machine,Java虚拟机)是运行所有Java程序的假想计算机,是Java程序的运行环境,负责执行指令、管理数据、内存、寄存器等,是实现Java跨平台特性的关键部分。JVM指令手册详细记录了JVM的所有操作...
- `boolean`:虽然JVM没有为`boolean`类型设置专门的指令,但在实现中通常使用整数指令来处理布尔值。 除了上述基本类型外,JVM还支持: - **对象引用**: - `object`:指向一个Java对象的4字节引用。在某些实现...
《深入浅出:Rust语言实现Mini-JVM》 在当今的编程世界中,Java虚拟机(JVM)因其高效、跨平台的特性而被广泛使用。然而,JVM的内部工作原理对于许多开发者来说仍然是一个神秘的概念。本文将探讨一个特殊的项目——...
Java虚拟机(JVM)中的垃圾回收(Garbage Collection, GC)是自动内存管理的关键机制,它负责识别并清理不再使用的对象,以便回收内存资源。本文将深入探讨JVM的垃圾回收策略,尤其是基于分代的内存回收算法。 在...
### Java中JVM原理与实现 #### 一、引言 Java虚拟机(JVM)作为Java语言的基础支撑,是确保Java程序能够在不同平台上顺畅运行的关键技术。本文将深入探讨JVM的工作原理及其核心组成部分,包括类加载器、运行时数据区...
这些数据通常在类加载时创建,并且在整个JVM生命周期中保持不变。对于HotSpot虚拟机而言,这部分区域被称为“永久代”(PermGen space),而在JVM 8之后,已经被“元空间”(Metaspace)所替代,其物理内存空间不再...
《深入解析NeatJVM:Java中的JVM实现》 在Java编程领域,JVM(Java虚拟机)是每一个开发者必须了解的关键组成部分。NeatJVM是一个开源项目,旨在为开发者提供一个清晰、简洁的Java虚拟机实现,帮助我们更好地理解和...
在JVM中,Java线程状态的保存和管理是通过java.lang.Thread类中的threadStatus字段实现的。JVM在创建线程时会分配一个Thread实例,该实例的threadStatus字段保存了线程的当前状态,反映了线程在Java虚拟机中的行为。...
在Java编程环境中,了解JVM(Java虚拟机)中所有线程的活动状态对于调试多线程程序至关重要。本文将详细讲解如何查看JVM中的线程活动情况,并提供相关示例代码。 首先,Java提供了`java.lang.management....
java对象在jvm中的存储情况 jvm
从源码角度解读HotSpot的内部实现机制,本书主要包含三大部分——JVM数据结构设计与实现、执行引擎机制及内存分配模型
标题中提到了JVM原理、JVM调优、JVM内存模型和JAVA并发,这些都是Java虚拟机(JVM)相关的核心概念。JVM是运行Java字节码的虚拟计算机,为Java提供了一个跨平台的环境,确保Java程序可以在不同的操作系统上运行而...
《迷你Java虚拟机(Mini-JVM):基于Java 8的实现详解》 在计算机科学领域,Java虚拟机(JVM)是Java平台的核心组成部分,它负责执行Java字节码,使得Java应用程序可以在任何支持JVM的平台上运行,实现“一次编写,...