粗略的点开btrace的源码看了一下,实际上他只是封装了JDK自带的功能而已
1. attach client到java进程
VirtualMachine vm = null; if (debug) { debugPrint("attaching to " + pid); } vm = VirtualMachine.attach(pid); if (debug) { debugPrint("checking port availability: " + port); } Properties serverVmProps = vm.getSystemProperties(); int serverPort = Integer.parseInt(serverVmProps.getProperty("btrace.port", "-1")); if (serverPort != -1) { if (serverPort != port) { throw new IOException("Can not attach to PID " + pid + " on port " + port + ". There is already a BTrace server active on port " + serverPort + "!"); } } else { if (!isPortAvailable(port)) { throw new IOException("Port " + port + " unavailable."); } } vm.loadAgent(agentPath, agentArgs);
2. 修改字节码
获取 Instrumentation 接口的实例有两种方式:
当 JVM 以指示一个代理类的方式启动时,将传递给代理类的 premain 方法一个 Instrumentation 实例。
当 JVM 提供某种机制在 JVM 启动之后某一时刻启动代理时,将传递给代理代码的 agentmain 方法一个 Instrumentation 实例。
拿到Instrumentation实例后,就可以替换class字节码了
// 返回 JVM 当前加载的所有类的数组 for (Class c : inst.getAllLoadedClasses()) { if (c != null) { cc.get(c); if (inst.isModifiableClass(c) && isCandidate(c)) { debugPrint("candidate " + c + " added"); list.add(c); } } } list.trimToSize(); int size = list.size(); if (size > 0) { Class[] classes = new Class[size]; list.toArray(classes); startRetransformClasses(size); if (isDebug()) { for(Class c : classes) { try { // 如果重转换的方法有活动的堆栈帧,那么这些活动的帧将继续运行原方法的字节码。重转换的方法将用于新的调用 // 此方法不会引起任何初始化操作,JVM 惯例语义下发生的初始化除外。换句话说,重定义一个类不会引起其初始化方法的运行。静态变量的值将与调用之前的值一样。 inst.retransformClasses(c); } catch (VerifyError e) { debugPrint("verification error: " + c.getName()); } } } else { inst.retransformClasses(classes); } }
相关推荐
在Java虚拟机(JVM)中,字节码自动加载是一项关键功能,它使得Java程序能够在运行时动态地发现和加载类。字节码是由Java源代码编译而成的二进制格式,它包含了类和接口的信息。了解JVM如何自动加载字节码对于深入...
总结而言,该文档覆盖了Tomcat服务器优化、JVM参数调整、字节码级别的优化以及代码层面的优化等多个方面,旨在通过一系列配置和操作,提升Java应用以及Web服务器的性能和效率。同时,也提到了性能测试的重要性和在...
这个压缩包文件"JVM优化3(Tomcat参数调优,JVM参数调优,jvm字节码,代码优化).zip"显然包含了关于如何优化Java应用程序运行效率的四个主要方面:Tomcat服务器的参数调整、JVM参数调优、JVM字节码理解和优化以及代码...
Java JVM 是 Java 语言的核心组件之一,负责将 Java 字节码翻译成机器语言并执行。要深入了解 JVM,可以从 Java 的特性入手,描绘 JVM 的大致应用,然后细细阐述 JVM 的原理及内存管理机制和调优。最后,还需要讲述...
- **性能优化**:通过字节码操作,可以直接在运行时调整算法,提高程序性能。 - **安全研究**:对于安全研究人员来说,Recaf可以帮助分析恶意软件的行为,或者保护自己的代码免受逆向工程。 - **插件开发**:创建...
在实际使用XJad时,用户通常需要具备一定的Java字节码知识,以及对JVM操作的理解。同时,由于XJad是一个较老的工具,可能不支持最新的Java特性或优化,因此对于现代的Java项目,开发者可能会选择使用如JD-GUI、...
- **性能优化**:调整字节码指令,提升程序运行效率。 - **逆向工程**:分析已封装或混淆的代码,了解其内部实现。 - **安全研究**:检测和防止恶意代码,或分析病毒行为。 ### 下载与资源 - **原版下载地址**:...
Java虚拟机(JVM)是Java程序运行的核心,它负责解析和执行字节码,管理内存,以及实现各种运行时特性。在这个名为"JV-jvm_practice.zip"的压缩包中,你将找到一系列关于JVM相关的代码示例,帮助你深入理解JVM的工作...
字节码执行引擎则是JVM的心脏,它通过解释器或即时编译器(JIT)将字节码转换为机器码。JIT技术能够在运行时动态优化代码,显著提升性能。此外,JVM的垃圾收集机制是其内存管理的关键,它自动回收不再使用的对象,...
1. **JVM基础**:JVM是Java语言的运行平台,它负责解析字节码并执行Java程序。书中会详细介绍JVM的结构,包括类加载子系统、运行时数据区、执行引擎等组成部分,让读者明白Java程序是如何在JVM上运行的。 2. **内存...
JVM 的堆空间可以根据实际需求动态调整大小,从而更好地适应程序运行时的变化情况。 为了提高内存分配效率,JVM 通常会采用一些优化策略,如分代收集技术。分代收集基于这样一个观察:大多数对象很快就会变得不可达...
JVM通过将字节码(Bytecode)解释执行或即时编译成机器码,使得Java程序能在任何支持JVM的设备上运行,实现了“一次编写,到处运行”的跨平台特性。 该文档中可能会涵盖以下几个关键知识点: 1. **内存模型**:JVM...
Java虚拟机(JVM)是Java程序运行的基础,它是一个抽象的计算机系统,负责执行Java字节码。在这个压缩包中,"JVM图解.png"可能是对JVM内部结构的可视化表示,"JVM图解"可能是一个详细的文档,解释了JVM的工作原理,...
JVM(Java虚拟机)是Java语言运行的基础,它负责执行Java字节码,并且是Java跨平台特性的关键实现。JVM的主要职责包括加载Java程序、验证字节码、将字节码转换成机器码执行、内存管理、垃圾回收和提供安全机制等。...
这一过程结合了编译和解释的特点,即先进行部分编译生成字节码,然后在运行时进行动态解释或即时编译(JIT)。 - **半编译半解释**:Java的这种运行模式意味着它在编译阶段并不直接生成机器码,而是生成中间形式的...
JVM通过解析字节码(Bytecode)来运行Java应用程序,实现了“一次编写,到处运行”的理念。本篇文章将深入探讨JVM的各个方面,包括其工作原理、内存模型、垃圾收集以及性能优化。 一、JVM工作原理 Java源代码经过...
Java虚拟机(JVM)是Java程序运行的核心,它负责解释和执行字节码,为Java应用程序提供了一个跨平台的运行环境。JDK(Java Development Kit)包含了开发和运行Java程序所需的所有工具,包括JVM。当我们谈论"jdk,jvm...
JIT编译是JVM中的一个关键特性,它通过即时编译技术将Java字节码动态编译成本地代码,提高程序的执行速度。这个过程包括解释执行和JIT编译,解释执行快速启动但效率低,JIT编译优化了运行效率但启动较慢。 总的来说...
Java虚拟机(JVM)是Java程序运行的基础,它是一个抽象的计算机系统,负责执行Java字节码。本文将深入探讨JVM的启动过程及其基本原理。 首先,我们需要理解JVM的基本概念。JVM是Java Virtual Machine的缩写,它是...