`
jimmee
  • 浏览: 537978 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

JVM动态调整字节码

    博客分类:
  • J2SE
阅读更多

粗略的点开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);
                }
            }

 

分享到:
评论

相关推荐

    jvm字节码自动加载

    在Java虚拟机(JVM)中,字节码自动加载是一项关键功能,它使得Java程序能够在运行时动态地发现和加载类。字节码是由Java源代码编译而成的二进制格式,它包含了类和接口的信息。了解JVM如何自动加载字节码对于深入...

    JVM优化3(Tomcat参数调优,JVM参数调优,jvm字节码,代码优化).pdf

    总结而言,该文档覆盖了Tomcat服务器优化、JVM参数调整、字节码级别的优化以及代码层面的优化等多个方面,旨在通过一系列配置和操作,提升Java应用以及Web服务器的性能和效率。同时,也提到了性能测试的重要性和在...

    JVM优化3(Tomcat参数调优,JVM参数调优,jvm字节码,代码优化).zip

    这个压缩包文件"JVM优化3(Tomcat参数调优,JVM参数调优,jvm字节码,代码优化).zip"显然包含了关于如何优化Java应用程序运行效率的四个主要方面:Tomcat服务器的参数调整、JVM参数调优、JVM字节码理解和优化以及代码...

    java JVM 详解

    Java JVM 是 Java 语言的核心组件之一,负责将 Java 字节码翻译成机器语言并执行。要深入了解 JVM,可以从 Java 的特性入手,描绘 JVM 的大致应用,然后细细阐述 JVM 的原理及内存管理机制和调优。最后,还需要讲述...

    XJad 字节码反编译工具

    在实际使用XJad时,用户通常需要具备一定的Java字节码知识,以及对JVM操作的理解。同时,由于XJad是一个较老的工具,可能不支持最新的Java特性或优化,因此对于现代的Java项目,开发者可能会选择使用如JD-GUI、...

    jvm相关代码仓库,包括类加载机制,字节码执行机制,JVM内存模型,GC垃圾回收,JV-jvm_practice.zip

    Java虚拟机(JVM)是Java程序运行的核心,它负责解析和执行字节码,管理内存,以及实现各种运行时特性。在这个名为"JV-jvm_practice.zip"的压缩包中,你将找到一系列关于JVM相关的代码示例,帮助你深入理解JVM的工作...

    JByteMod-1.6.1(java字节码编辑器)简介及下载

    - **性能优化**:调整字节码指令,提升程序运行效率。 - **逆向工程**:分析已封装或混淆的代码,了解其内部实现。 - **安全研究**:检测和防止恶意代码,或分析病毒行为。 ### 下载与资源 - **原版下载地址**:...

    深入理解Java虚拟机(jvm性能调优+内存模型+虚拟机原理).zip

    字节码执行引擎则是JVM的心脏,它通过解释器或即时编译器(JIT)将字节码转换为机器码。JIT技术能够在运行时动态优化代码,显著提升性能。此外,JVM的垃圾收集机制是其内存管理的关键,它自动回收不再使用的对象,...

    Recaf一个现代Java字节码编辑器

    - **性能优化**:通过字节码操作,可以直接在运行时调整算法,提高程序性能。 - **安全研究**:对于安全研究人员来说,Recaf可以帮助分析恶意软件的行为,或者保护自己的代码免受逆向工程。 - **插件开发**:创建...

    深入理解jvm

    1. **JVM基础**:JVM是Java语言的运行平台,它负责解析字节码并执行Java程序。书中会详细介绍JVM的结构,包括类加载子系统、运行时数据区、执行引擎等组成部分,让读者明白Java程序是如何在JVM上运行的。 2. **内存...

    jvm 详细介绍,了解jvm各个组成部分和功能

    JVM 的堆空间可以根据实际需求动态调整大小,从而更好地适应程序运行时的变化情况。 为了提高内存分配效率,JVM 通常会采用一些优化策略,如分代收集技术。分代收集基于这样一个观察:大多数对象很快就会变得不可达...

    JVM standard

    JVM通过将字节码(Bytecode)解释执行或即时编译成机器码,使得Java程序能在任何支持JVM的设备上运行,实现了“一次编写,到处运行”的跨平台特性。 该文档中可能会涵盖以下几个关键知识点: 1. **内存模型**:JVM...

    JVM图解-JVM指令-JVM原型图.rar

    Java虚拟机(JVM)是Java程序运行的基础,它是一个抽象的计算机系统,负责执行Java字节码。在这个压缩包中,"JVM图解.png"可能是对JVM内部结构的可视化表示,"JVM图解"可能是一个详细的文档,解释了JVM的工作原理,...

    JVM原理讲解和调优,详细讲解JVM底层

    JVM(Java虚拟机)是Java语言运行的基础,它负责执行Java字节码,并且是Java跨平台特性的关键实现。JVM的主要职责包括加载Java程序、验证字节码、将字节码转换成机器码执行、内存管理、垃圾回收和提供安全机制等。...

    jvm详解资料

    这一过程结合了编译和解释的特点,即先进行部分编译生成字节码,然后在运行时进行动态解释或即时编译(JIT)。 - **半编译半解释**:Java的这种运行模式意味着它在编译阶段并不直接生成机器码,而是生成中间形式的...

    jvm paper jvm

    JVM通过解析字节码(Bytecode)来运行Java应用程序,实现了“一次编写,到处运行”的理念。本篇文章将深入探讨JVM的各个方面,包括其工作原理、内存模型、垃圾收集以及性能优化。 一、JVM工作原理 Java源代码经过...

    jdk,jvm源码

    Java虚拟机(JVM)是Java程序运行的核心,它负责解释和执行字节码,为Java应用程序提供了一个跨平台的运行环境。JDK(Java Development Kit)包含了开发和运行Java程序所需的所有工具,包括JVM。当我们谈论"jdk,jvm...

    推荐一些JVM原理,JVM调优,JVM内存模型,JAVA并发 电子书1

    JIT编译是JVM中的一个关键特性,它通过即时编译技术将Java字节码动态编译成本地代码,提高程序的执行速度。这个过程包括解释执行和JIT编译,解释执行快速启动但效率低,JIT编译优化了运行效率但启动较慢。 总的来说...

    jvm 启动过程 JVM 原理

    Java虚拟机(JVM)是Java程序运行的基础,它是一个抽象的计算机系统,负责执行Java字节码。本文将深入探讨JVM的启动过程及其基本原理。 首先,我们需要理解JVM的基本概念。JVM是Java Virtual Machine的缩写,它是...

Global site tag (gtag.js) - Google Analytics