`
Anddy
  • 浏览: 197895 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

JVM 反汇编动态运行代码

    博客分类:
  • java
阅读更多

Java HotSpot(TM) Server VM warning: PrintAssembly is enabled; turning on DebugNonSafepoints to gain additional output
CompilerOracle: dontinline *GenericClass.*
Could not load hsdis-i386.so; library not loadable; PrintAssembly is disabled

 

//尝试 输出动态的反汇编Code时 ,提示上面的错误。 没有hsdir这个可加载的反汇编的插件(an externally loadable disassembler plugin) 。

对该插件的阐述如下

写道
Sun HotSpot需要一个反汇编插件才可以使用-XX:+PrintAssembly参数来打印JIT编译生成的代码。该插件有一组通用接口,本来是可以用任意反汇编器套个适配器就行。官方提供了一个现成的版本(hsdis)是基于gnu as的

 

 

对该插件的安装等详细参考 http://hg.openjdk.java.net/jdk7/hotspot/hotspot/file/9ad1548c6b63/src/share/tools/hsdis/README

 

安装过程中需要 binutils这个软件,这个软件版本至少是2.17 , 如果是编译为windows 平台下的dll 则版本至少是2.19。

    我采用了当前最新版本。下载地址:http://directory.fsf.org/project/binutils/

下载完加压在 build/目录下,目录结构如下图:


开始编译 ,提供的编译很几种,查看Makefile文件或者README文件可知如下几种:

1, make all

2, make both

3, make demo

4, make clean

(不解释,阴文你懂的)

我选择make all 。

第一编译,得到一个 Warning : 提醒没有安装makeinfo。然后出现该死的Error

OK,安装makeinfo

  // sudo apt-get install makeinfo

 

第二次编译 得到如下错误


没有找到 sysdep.h文件 。

// 查找

find -name sysdep.h

//output

./build/binutils/bfd/sysdep.h
./build/binutils/binutils/sysdep.h
./build/binutils/ld/sysdep.h
./build/binutils/opcodes/sysdep.h

 

而上面错误提示中编译时 头文件查找路径是

写道
-I/home/hyvi/下载/software-source/hotspot/src/share/tools/hsdis/build/binutils/include -I/bfd -Ibuild/linux-i586/bfd

 -I/bfd  这是根路径下啊!

 

查看Makefile 代码 121行。 

CPPFLAGS    += -I$(BINUTILSDIR)/include -I$(BINUTILS)/bfd -I$(TARGET_DIR)/bfd

 以及关于 BINUTILS 值

ifeq            ($(BINUTILS),)
# Pop all the way out of the workspace to look for binutils.
# ...You probably want to override this setting.
BINUTILSDIR = $(shell cd build/binutils;pwd)
else
BINUTILSDIR = $(shell cd $(BINUTILS);pwd)
endif

如果未指定 BINUTILS 的话,即 BINUTILS为空, BINUTILSDIR 为 build/binutils

而我编译的时候未指定 BINUTILS ,所以为空。 所以出现 “-I/bfd ”

 

纠正办法:

1,修改Makefile , (我使用)

-I$(BINUTILS)/bfd 

改成

-I$(BINUTILSDIR)/bfd 

 

2 ,编译的时候 加上 参数 BINUTILS = "build/binutils" (未测试)

 

第三次编译 ,通过。在 bulid/Linux-i586/目录下生成了 hsdis-i386.so

 

最后,安装.so文件了。方法有二 :

 

1, Copy  hsdis-i386.so 到 java虚拟机安装目录的 jre/lib/i386/client/ 或者 (或和) jre/lib/i386/server/ 下 (跟libjvm.so同一目录)。

 

2, 将 hsdis-i386.so 添加到 LD_LIBRARY_PATH 里。

   vim ~/.bashrc

// 最后一行添加

#HotSpot support hsdis 
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:....(省略)hsdis/build/linux-i586

source ~/.bashrc 

 

测试 :

 

java -Xcomp -XX:CompileCommand=dontinline,*GenericClass.*
 -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly Z > comp.log
 

生成 comp.log , 里面6万多行。如果要做比较,只能用diff工具。

 

补上参考:

http://hllvm.group.iteye.com/group/topic/21769    X86 asm代码 是怎么才能看到?

http://wikis.sun.com/display/HotSpotInternals/PrintAssembly  PrintAssembly使用

http://directory.fsf.org/project/binutils/    Binutils工具 

http://hllvm.group.iteye.com/group/topic/25910#183635  Java泛型的性能损耗

http://hg.openjdk.java.net/jdk7/hotspot/hotspot/file/tip/src/share/tools/hsdis/  hsdis 工具

http://kenai.com/projects/base-hsdis/lists/dev/archive/2009-11/message/0  类似编译问题

 

 

 

 

 

 

 

 

 

 

  • 大小: 6.5 KB
  • 大小: 48.3 KB
分享到:
评论
3 楼 lucane 2011-05-15  
今天请教R大一个问题,然后用他提到的hsdis跑代码看,但是我出来的日志中就是没有我自己的类相关的东西,全是Java自带的,我想看到自己的类相关的东西,该怎么弄呢,我的环境
2.6.35-28-generic #50-Ubuntu SMP i686 GNU/Linux
javac 1.6.0_25
Java HotSpot(TM) Client VM warning: PrintAssembly is enabled; turning on DebugNonSafepoints to gain additional output
CompilerOracle: dontinline TestC2BranchPrediction2.conditionalBranch
CompilerOracle: dontinline TestC2BranchPrediction2.marker
Loaded disassembler from hsdis-i386.so

我的两个配置文件如下,
.hotspot_compiler 写道
dontinline TestC2BranchPrediction2 conditionalBranch
dontinline TestC2BranchPrediction2 marker


.hotspotrc 写道
+UnlockDiagnosticVMOptions
+PrintAssembly


跑出来的日志的method相关如下:

  # {method} 'hashCode' '()I' in 'java/lang/String'
  # {method} 'charAt' '(I)C' in 'java/lang/String'
  # {method} 'encodeArrayLoop' '(Ljava/nio/CharBuffer;Ljava/nio/ByteBuffer;)Ljava/nio/charset/CoderResult;' in 'sun/nio/cs/UTF_8$Encoder'
  # {method} 'indexOf' '(II)I' in 'java/lang/String'
  # {method} 'lastIndexOf' '(II)I' in 'java/lang/String'
  # {method} 'equals' '(Ljava/lang/Object;)Z' in 'java/lang/String'
  # {method} 'replace' '(CC)Ljava/lang/String;' in 'java/lang/String'
  # {method} 'indexOf' '([CII[CIII)I' in 'java/lang/String'
  # {method} '<init>' '()V' in 'java/lang/Object'
  # {method} 'encodePath' '(Ljava/lang/String;Z)Ljava/lang/String;' in 'sun/net/www/ParseUtil'
  # {method} 'arraycopy' '(Ljava/lang/Object;ILjava/lang/Object;II)V' in 'java/lang/System'
  # {method} 'startsWith' '(Ljava/lang/String;I)Z' in 'java/lang/String'
  # {method} 'normalize' '(Ljava/lang/String;)Ljava/lang/String;' in 'java/io/UnixFileSystem'
  # {method} 'readLine' '(Z)Ljava/lang/String;' in 'java/io/BufferedReader'
  # {method} 'decodeArrayLoop' '(Ljava/nio/ByteBuffer;Ljava/nio/CharBuffer;)Ljava/nio/charset/CoderResult;' in 'sun/nio/cs/UTF_8$Decoder'
  # {method} 'min' '(II)I' in 'java/lang/Math'
  # {method} 'getChars' '(II[CI)V' in 'java/lang/String'
  # {method} 'mayContain' '(Ljava/lang/String;)Z' in 'sun/misc/MetaIndex'
  # {method} 'startsWith' '(Ljava/lang/String;)Z' in 'java/lang/String'
  # {method} 'getProperties' '(I)I' in 'java/lang/CharacterDataLatin1'
  # {method} 'hashValue' '([BII)I' in 'com/sun/tools/javac/util/Name'
  # {method} 'chars2utf' '([CI[BII)I' in 'com/sun/tools/javac/util/Convert'
  # {method} 'equals' '([BI[BII)Z' in 'com/sun/tools/javac/util/Name'
  # {method} '<init>' '(II[C)V' in 'java/lang/String'
  # {method} 'append' '(Ljava/lang/String;)Ljava/lang/AbstractStringBuilder;' in 'java/lang/AbstractStringBuilder'
  # {method} 'indexFor' '(II)I' in 'java/util/HashMap'
  # {method} 'hash' '(I)I' in 'java/util/HashMap'
  # {method} 'substring' '(II)Ljava/lang/String;' in 'java/lang/String'
  # {method} 'getLoader' '(I)Lsun/misc/URLClassPath$Loader;' in 'sun/misc/URLClassPath'
  # {method} 'getResource' '(Ljava/lang/String;Z)Lsun/misc/Resource;' in 'sun/misc/URLClassPath'
  # {method} 'get' '(Ljava/lang/Object;)Ljava/lang/Object;' in 'java/util/HashMap'
  # {method} 'indexOf' '(I)I' in 'java/lang/String'
  # {method} '<init>' '([CII)V' in 'java/lang/String'
  # {method} 'copyOfRange' '([CII)[C' in 'java/util/Arrays'
  # {method} 'RangeCheck' '(I)V' in 'java/util/ArrayList'
  # {method} 'getResource' '(Ljava/lang/String;Z)Lsun/misc/Resource;' in 'sun/misc/URLClassPath$JarLoader'
  # {method} 'allowArraySyntax' '()Z' in 'sun/misc/VM'
  # {method} 'checkName' '(Ljava/lang/String;)Z' in 'java/lang/ClassLoader'
  # {method} 'equalsIgnoreCase' '(Ljava/lang/String;)Z' in 'java/lang/String'
  # {method} 'append' '(Ljava/lang/String;)Ljava/lang/StringBuilder;' in 'java/lang/StringBuilder'
  # {method} 'lastIndexOf' '(I)I' in 'java/lang/String'
  # {method} 'copyOf' '([CI)[C' in 'java/util/Arrays'
  # {method} 'expandCapacity' '(I)V' in 'java/lang/AbstractStringBuilder'
  # {method} 'toLowerCase' '(C)C' in 'java/lang/Character'
  # {method} 'toLowerCase' '(I)I' in 'java/lang/Character'
  # {method} 'toLowerCase' '(I)I' in 'java/lang/CharacterDataLatin1'
  # {method} 'access$300' '(Ljava/util/zip/ZipFile;)J' in 'java/util/zip/ZipFile'
  # {method} 'readEntry' '(ILjava/util/List;Ljava/util/Map;)I' in 'com/sun/tools/javac/zip/ZipFileIndex$ZipDirectory'
  # {method} 'position' '(I)Ljava/nio/Buffer;' in 'java/nio/Buffer'
  # {method} 'isUnderflow' '()Z' in 'java/nio/charset/CoderResult'
  # {method} 'compareTo' '(Ljava/lang/String;)I' in 'java/lang/String'
  # {method} 'compareTo' '(Ljava/lang/Object;)I' in 'com/sun/tools/javac/zip/ZipFileIndexEntry'
  # {method} 'compareTo' '(Lcom/sun/tools/javac/zip/ZipFileIndexEntry;)I' in 'com/sun/tools/javac/zip/ZipFileIndexEntry'
  # {method} 'get4ByteLittleEndian' '([BI)I' in 'com/sun/tools/javac/zip/ZipFileIndex'
  # {method} 'getSecurityManager' '()Ljava/lang/SecurityManager;' in 'java/lang/System'
  # {method} 'intern' '()Ljava/lang/String;' in 'java/lang/String'
  # {method} 'currentThread' '()Ljava/lang/Thread;' in 'java/lang/Thread'
  # {method} 'limit' '(I)Ljava/nio/Buffer;' in 'java/nio/Buffer'
  # {method} '<init>' '(IIII)V' in 'java/nio/Buffer'
  # {method} 'get' '()Ljava/lang/Object;' in 'java/lang/ref/SoftReference'
  # {method} 'arrayOffset' '()I' in 'java/nio/ByteBuffer'
  # {method} 'arrayOffset' '()I' in 'java/nio/CharBuffer'
  # {method} 'getMap' '(Ljava/lang/Thread;)Ljava/lang/ThreadLocal$ThreadLocalMap;' in 'java/lang/ThreadLocal'
  # {method} 'hasRemaining' '()Z' in 'java/nio/Buffer'
  # {method} 'hasArray' '()Z' in 'java/nio/CharBuffer'
  # {method} '<init>' '(IIII[BI)V' in 'java/nio/ByteBuffer'
  # {method} 'byteOrder' '()Ljava/nio/ByteOrder;' in 'java/nio/Bits'
  # {method} 'hasArray' '()Z' in 'java/nio/ByteBuffer'
  # {method} 'isOverflow' '()Z' in 'java/nio/charset/CoderResult'
  # {method} '<init>' '(IIII[CI)V' in 'java/nio/CharBuffer'
  # {method} 'wrap' '([CII)Ljava/nio/CharBuffer;' in 'java/nio/CharBuffer'
  # {method} '<init>' '([CII)V' in 'java/nio/HeapCharBuffer'
  # {method} 'get' '()Ljava/lang/Object;' in 'java/lang/ThreadLocal'
  # {method} 'deref' '(Ljava/lang/ThreadLocal;)Ljava/lang/Object;' in 'java/lang/StringCoding'
  # {method} 'access$000' '(Ljava/lang/ThreadLocal$ThreadLocalMap;Ljava/lang/ThreadLocal;)Ljava/lang/ThreadLocal$ThreadLocalMap$Entry;' in 'java/lang/ThreadLocal$ThreadLocalMap'
  # {method} 'getEntry' '(Ljava/lang/ThreadLocal;)Ljava/lang/ThreadLocal$ThreadLocalMap$Entry;' in 'java/lang/ThreadLocal$ThreadLocalMap'
  # {method} 'access$000' '(IF)I' in 'java/lang/StringCoding'
  # {method} 'scale' '(IF)I' in 'java/lang/StringCoding'
  # {method} 'wrap' '([BII)Ljava/nio/ByteBuffer;' in 'java/nio/ByteBuffer'
  # {method} '<init>' '([BII)V' in 'java/nio/HeapByteBuffer'
  # {method} 'ensureCapacity' '(I)V' in 'java/util/ArrayList'
  # {method} 'add' '(Ljava/lang/Object;)Z' in 'java/util/ArrayList'
  # {method} 'decode' '(Ljava/nio/ByteBuffer;Ljava/nio/CharBuffer;Z)Ljava/nio/charset/CoderResult;' in 'java/nio/charset/CharsetDecoder'
  # {method} 'decodeLoop' '(Ljava/nio/ByteBuffer;Ljava/nio/CharBuffer;)Ljava/nio/charset/CoderResult;' in 'sun/nio/cs/UTF_8$Decoder'
  # {method} 'checkBounds' '([BII)V' in 'java/lang/String'
  # {method} 'reset' '()Ljava/nio/charset/CharsetDecoder;' in 'java/nio/charset/CharsetDecoder'
  # {method} 'maxCharsPerByte' '()F' in 'java/nio/charset/CharsetDecoder'
  # {method} '<init>' '([BIILjava/lang/String;)V' in 'java/lang/String'
  # {method} 'decode' '(Ljava/lang/String;[BII)[C' in 'java/lang/StringCoding'
  # {method} 'decode' '([BII)[C' in 'java/lang/StringCoding$StringDecoder'
  # {method} 'wrap' '([C)Ljava/nio/CharBuffer;' in 'java/nio/CharBuffer'
  # {method} 'flush' '(Ljava/nio/CharBuffer;)Ljava/nio/charset/CoderResult;' in 'java/nio/charset/CharsetDecoder'
  # {method} 'implFlush' '(Ljava/nio/CharBuffer;)Ljava/nio/charset/CoderResult;' in 'java/nio/charset/CharsetDecoder'
  # {method} 'access$100' '([CILjava/nio/charset/Charset;)[C' in 'java/lang/StringCoding'
  # {method} 'safeTrim' '([CILjava/nio/charset/Charset;)[C' in 'java/lang/StringCoding'
  # {method} 'access$1000' '()Lcom/sun/tools/javac/util/List;' in 'com/sun/tools/javac/zip/ZipFileIndex'
  # {method} 'put' '(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;' in 'java/util/HashMap'
  # {method} 'buildIndex' '()V' in 'com/sun/tools/javac/zip/ZipFileIndex$ZipDirectory'
  # {method} 'mergeSort' '([Ljava/lang/Object;[Ljava/lang/Object;III)V' in 'java/util/Arrays'
  # {method} 'swap' '([Ljava/lang/Object;II)V' in 'java/util/Arrays'
  # {method} 'transfer' '([Ljava/util/HashMap$Entry;)V' in 'java/util/HashMap'
  # {method} '<init>' '()V' in 'java/util/AbstractCollection'
  # {method} 'substring' '(I)Ljava/lang/String;' in 'java/lang/String'
  # {method} 'nonEmpty' '()Z' in 'com/sun/tools/javac/util/List'
  # {method} '<init>' '(Ljava/lang/Object;Lcom/sun/tools/javac/util/List;)V' in 'com/sun/tools/javac/util/List'
  # {method} 'setTail' '(Lcom/sun/tools/javac/util/List;)Lcom/sun/tools/javac/util/List;' in 'com/sun/tools/javac/util/List'
  # {method} 'prependList' '(Lcom/sun/tools/javac/util/List;)Lcom/sun/tools/javac/util/List;' in 'com/sun/tools/javac/util/List'
  # {method} 'reverse' '()Lcom/sun/tools/javac/util/List;' in 'com/sun/tools/javac/util/List'
  # {method} 'get' '(I)Ljava/lang/Object;' in 'java/util/ArrayList'
  # {method} 'lastIndexOf' '([CII[CIII)I' in 'java/lang/String'
  # {method} 'hashCode' '()I' in 'java/lang/Object'
  # {method} '<init>' '(I)V' in 'java/lang/AbstractStringBuilder'
  # {method} 'getClass' '()Ljava/lang/Class;' in 'java/lang/Object'
  # {method} 'append' '(C)Ljava/lang/AbstractStringBuilder;' in 'java/lang/AbstractStringBuilder'
  # {method} 'append' '(C)Ljava/lang/StringBuilder;' in 'java/lang/StringBuilder'
  # {method} '<init>' '(ILjava/lang/Object;Ljava/lang/Object;Ljava/util/HashMap$Entry;)V' in 'java/util/HashMap$Entry'
  # {method} 'charCount' '(I)I' in 'java/lang/Character'
  # {method} 'isHighSurrogate' '(C)Z' in 'java/lang/Character'
  # {method} 'codePointAt' '(I)I' in 'java/lang/String'
  # {method} 'codePointAtImpl' '([CII)I' in 'java/lang/Character'
  # {method} 'isIdentifier' '(Ljava/lang/CharSequence;)Z' in 'javax/lang/model/SourceVersion'
  # {method} 'isJavaIdentifierPart' '(I)Z' in 'java/lang/Character'
  # {method} 'isJavaIdentifierPart' '(I)Z' in 'java/lang/CharacterDataLatin1'
  # {method} 'addEntry' '(ILjava/lang/Object;Ljava/lang/Object;I)V' in 'java/util/HashMap'
  # {method} 'endsWith' '(Ljava/lang/String;)Z' in 'java/lang/String'
  # {method} 'isEmpty' '()Z' in 'com/sun/tools/javac/util/List'
  # {method} 'toString' '()Ljava/lang/String;' in 'java/lang/StringBuilder'
  # {method} 'indexedBinarySearch' '(Ljava/util/List;Ljava/lang/Object;)I' in 'java/util/Collections'
  # {method} '<init>' '()V' in 'java/lang/StringBuilder'
  # {method} 'lookup' '(Lcom/sun/tools/javac/util/Name;)Lcom/sun/tools/javac/code/Scope$Entry;' in 'com/sun/tools/javac/code/Scope'
  # {method} 'getBytes' '([BI)V' in 'com/sun/tools/javac/util/Name'
  # {method} 'lastIndexOf' '(Ljava/lang/String;I)I' in 'java/lang/String'
  # {method} 'lastIndexOf' '(Ljava/lang/String;)I' in 'java/lang/String'
  # {method} 'nil' '()Lcom/sun/tools/javac/util/List;' in 'com/sun/tools/javac/util/List'
  # {method} 'hashCode' '()I' in 'java/lang/Enum'
  # {method} '<init>' '(Ljava/net/URL;Ljava/lang/String;Ljava/net/URLStreamHandler;)V' in 'java/net/URL'


这是自己运行的代码
TestC2BranchPrediction2.java
import java.util.Random;

public class TestC2BranchPrediction2 {
  public static void main(String[] args) {
    Random rand = new Random();

    int count0 = 0;
    int count2 = 0;

    for (int i = 0; i < 10000000L; i++) {
      int state = rand.nextInt(10);
      switch (state) {
      case 0:
        if(20 >= count0) {
            conditionalBranch(state);
            count0++;
        }
        break;
      case 1:
        conditionalBranch(state);
        break;
      case 2:
        if(200 >= count2) {
            conditionalBranch(state);
            count2++;
        }
        break;
      }
    }
  }

  public static void conditionalBranch(int flag) {
    if (0 == flag) {
      marker("DO SOMETHING A");
    } else if (1 == flag) {
      marker("DO SOMETHING B");
    } else if (2 == flag) {
      marker("DO SOMETHING C");
    }
  }

  public static void marker(String message) {
    try { message.intern(); } catch (Exception e) { }
  }
}
2 楼 igotti 2011-05-13  
原来-XX:+PrintAssembly还需要安装插件

1 楼 RednaxelaFX 2011-05-13  
嗯Good,继续有新的同好开始鼓捣这些东西真好 ^_^
我在编译hsdis的时候是直接把sysdep.h的include给删了,毫无影响。在Ubuntu上编译的。以前记过,在这里:https://gist.github.com/673705

相关推荐

    jvm反汇编插件

    "jvm反汇编插件"就是这样一种工具,它允许我们查看JIT编译后的本地代码,以便分析和调试。 【描述】: 在Windows操作系统下,有一种JVM反汇编插件特别实用,它能够帮助开发者对JIT编译的代码进行反汇编,揭示其...

    jvm反汇编插件hsdis

    《深入理解JVM反汇编插件HSDis》 在Java世界中,JVM(Java虚拟机)扮演着至关重要的角色,它负责解释和执行Java字节码,从而实现跨平台运行。为了优化性能和进行故障排查,开发者有时需要查看JVM内部的运作机制,而...

    java反汇编软件可以反汇编class文件

    Java反汇编软件是开发者和逆向工程师在处理Java字节码时的得力工具,它们能够将编译后的.class文件转换回可读性较高的源代码形式。这在理解已编译的Java程序、调试、分析或研究二进制代码时非常有用。本文将深入探讨...

    简易java反汇编工具

    Java反汇编是将Java字节码转换为人类可读的源代码表示的过程,这对于理解已编译的Java类文件的内部工作原理、调试、逆向工程或教学都非常有用。在Java领域,JVM(Java虚拟机)执行的是字节码,这是一种中间语言,而...

    java 反汇编

    总的来说,Java反汇编是Java开发者的一项重要技能,它让我们能够更深入地洞察代码的运行过程,从而提高我们的编程能力和问题解决能力。而JavaClassViewer.binary可能是用于图形化展示Java类文件反汇编结果的工具,它...

    hsdis工具,hotspot虚拟机插件,反汇编jit编译代码

    本文将深入探讨HSDis工具、HotSpot虚拟机以及反汇编在JVM中的应用。 HSDis全称为HotSpot Disassembler,是一个二进制转汇编的工具。它能够将JIT编译后的机器码转换为可读的汇编代码,这对于分析和调试JVM内部行为...

    查看运行代码的汇编指令的工具

    `javap`是Java虚拟机(JVM)的一部分,通过反编译Class文件,我们可以看到方法的原始字节码以及解释为的汇编指令。这个工具对于性能调优、理解和分析JVM的工作机制非常有用。 使用`javap`的基本语法是: ```bash ...

    java反汇编工具

    在Java平台中,源代码被编译成字节码,这是一种中间语言,可以在Java虚拟机(JVM)上运行。反汇编工具将这些不可读的字节码转换为更接近高级语言的形式,使得分析和调试变得更加容易。 标题“java反汇编工具”暗示...

    java反汇编指令.doc

    通过反汇编,开发者可以更好地分析代码执行流程,定位性能瓶颈,以及在没有源码的情况下理解二进制类文件的行为。此外,这些知识对于编写JIT编译器、开发字节码级别的工具(如动态代理库)或者进行安全分析等高级...

    java反汇编工具咖啡杯

    1. **理解字节码**:字节码是Java程序在JVM上的执行形式,反汇编后可以直观地看到这些指令,帮助开发者了解程序的运行流程。 2. **调试问题**:当遇到难以追踪的错误时,查看字节码可以帮助定位问题所在,尤其是在...

    hsdis-amd64.dll反汇编程序插件

    hsdis-amd64.dll是一款用于Java HotSpot虚拟机(JVM)的反汇编插件,主要用于帮助开发者查看和理解Java字节码在实际执行时如何被转换为机器码的过程。这款插件是开源的,并且是Java开发工具集(JDK)的一部分,对于...

    jclasslib JAVA反汇编

    Java反汇编是将已编译的字节码文件(.class文件)转换为人类可读的源代码表示形式的过程,这对于理解Java类文件的工作原理、逆向工程、调试和性能优化都非常重要。jclasslib是一款强大的GUI工具,它允许开发者深入...

    Java JVM Instruction Set

    可以使用`javap`工具来反汇编已编译的Java类文件,查看字节码指令。例如,如果想要检查`X.class`文件中的字节码,可以使用命令: ```bash % javap -c X.class ``` ##### main()函数的局部变量部分 `main()`函数...

    JVM指令

    - **jad**:JaCoCo的反汇编器,提供了更详细的字节码分析功能。 - **IntelliJ IDEA或Eclipse插件**:这些集成开发环境通常有内置的字节码查看器,方便在调试过程中查看字节码。 ### 4. 优化JVM指令 通过优化JVM...

    00-JVM指令手册.pdf

    在Java源代码编译成.class文件后,其中包含的Java字节码指令可通过Java的反汇编工具(如javap)转换为人类可读的文本形式。本手册将指导读者理解这些字节码指令的意义以及它们如何操作Java虚拟机的栈、局部变量、...

    jvm解析编译过的class文件

    例如,`javap`是Java自带的反汇编工具,可以查看编译后的字节码和相关的元数据。通过`javap -c TestClass`,我们可以看到TestClass类的方法定义和字节码指令。 另外,` jclasslib`是一款可视化的字节码查看器,它...

    hsdis-amd64.dll

    hsdis-amd64.dll的工作原理是,当JVM遇到一个新的方法要执行时,如果启用了字节码反汇编,它会调用该插件将字节码反汇编成AMD64架构的汇编代码。这个插件不仅提供了反汇编服务,还包含了一些用于解释Java字节码到...

    JVM与Java体系结构.pdf

    6. **JVM优化**:JVM提供了多种工具和选项来查看和调整其行为,如`javap`用于反汇编字节码,`-verbose:gc`用于输出GC日志,`-XX:`系列参数可以调整JVM的内存设置、垃圾收集策略等。 了解JVM的底层原理对于Java...

    Java JVMJava JVMJava JVM

    Java的类文件由一系列固定格式组成,如`javap -c CompileClass.class`用于反汇编类文件。`ClassFile`结构包含魔法数字、版本号、常量池、访问标志、类和超类信息等。字节码指令由操作码和操作数构成,虚拟机采用操作...

    hsdis.dll.zip

    hsdis.dll是特定于Java的一个动态链接库,全称为HotSpot Service Disassembler,它是Oracle JDK中用于Java字节码反汇编的工具,尤其对于理解和调试Java虚拟机(JVM)的行为非常有帮助。 hsdis.dll的工作原理是将...

Global site tag (gtag.js) - Google Analytics