- 浏览: 197896 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (124)
- java (25)
- 项目学习 (7)
- Web JSP (14)
- English study (1)
- windows (17)
- Thinking in Java (2)
- SSD4 VB (1)
- VB.NET (9)
- CSS (11)
- JQuery (4)
- Struts2 (0)
- spring (1)
- Hibernate (1)
- Dojo (0)
- Prototype (0)
- JSON (1)
- Ajax (1)
- my life my computer (1)
- html (1)
- JavaCC (0)
- c# (1)
- C/C++ (1)
- SQL (0)
- PS (1)
- Linux (21)
- Flex (1)
- mysql (1)
最新评论
-
wshy33:
按照这个“去掉/jre/lib/ext/目录下的jaxen.j ...
xpath的使用遇到的问题 -
白色蜻蜓:
什么是ssh
Linux ---SSH密钥问题解决 -
lucane:
今天请教R大一个问题,然后用他提到的hsdis跑代码看,但是我 ...
JVM 反汇编动态运行代码 -
igotti:
原来-XX:+PrintAssembly还需要安装插件
JVM 反汇编动态运行代码 -
RednaxelaFX:
嗯Good,继续有新的同好开始鼓捣这些东西真好 ^_^我在编译 ...
JVM 反汇编动态运行代码
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) 。
对该插件的阐述如下
对该插件的安装等详细参考 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/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 类似编译问题
评论
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
我的两个配置文件如下,
dontinline TestC2BranchPrediction2 marker
+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) { } } }
我在编译hsdis的时候是直接把sysdep.h的include给删了,毫无影响。在Ubuntu上编译的。以前记过,在这里:https://gist.github.com/673705
发表评论
-
Android rpg 游戏开发
2011-04-23 15:36 2490Android 游戏开发 记录点滴 rpg 游戏的地图 ... -
xpath的使用遇到的问题
2011-01-06 20:40 3021org.dom4j.InvalidXPathException ... -
Boolean的构造函数,你懂的
2010-11-27 20:52 1250学java不看源码是上不了一个等级的! ========== ... -
maven project 转化为eclipse project
2010-10-10 16:42 1515There is actually a very easy s ... -
UDAS
2010-09-24 12:31 1111UDAS 的全称:uniform data access s ... -
Java备忘
2010-05-02 09:12 1363/////////////////////////////// ... -
Java 虚拟机
2010-05-01 12:50 906//////////////////////////// ... -
cmm解释器--java实现
2010-04-18 13:02 1534目录: cmm编译器-cmm 语言词法分析-java实现 ... -
cmm编译器-cmm 语言LL1解释器构造-java实现
2010-04-18 12:57 2270附件是整个实验的文档和代码(由三人Hyvi,Heger,AJ负 ... -
cmm编译器-cmm 语言LL1语法分析-java实现
2010-04-18 12:11 2561cmm编译器-cmm 语言LL1语法分析-java实现 附件 ... -
cmm编译器-cmm 语言语法分析-javacc实现
2010-04-18 12:01 5506Cmm的文法: //程序开始 programàstmt-s ... -
cmm编译器-cmm 语言词法分析-java实现
2010-04-18 11:51 2835词法设计理念 1. 注释处理: 在处理注释的问题 ... -
Linux 下 Java环境的详细信息
2010-03-14 01:08 1283先把代码贴上: 1 import java.uti ... -
神奇的“按钮”
2010-03-11 23:12 889早期的反模式:神奇的按钮 神奇的Servlet ... -
RUBY
2009-06-10 14:23 988# rail:良好的惯例高于配 ... -
switch 与default 与break
2009-02-19 21:36 1128public class B { public s ... -
2008期末Collections&arrays总结
2009-01-16 00:48 888全部是静态方法 public static int binar ... -
2008年期末考试复习总结
2009-01-15 17:13 842类成员访问修饰符与继承的关系 私有的(private)类成员 ... -
Exercise 2
2008-11-26 17:12 1267Background This assignment ask ... -
SingleTon
2008-11-07 13:34 883大二期--中考试Java程序设计最后一题如下 Write do ...
相关推荐
"jvm反汇编插件"就是这样一种工具,它允许我们查看JIT编译后的本地代码,以便分析和调试。 【描述】: 在Windows操作系统下,有一种JVM反汇编插件特别实用,它能够帮助开发者对JIT编译的代码进行反汇编,揭示其...
《深入理解JVM反汇编插件HSDis》 在Java世界中,JVM(Java虚拟机)扮演着至关重要的角色,它负责解释和执行Java字节码,从而实现跨平台运行。为了优化性能和进行故障排查,开发者有时需要查看JVM内部的运作机制,而...
Java反汇编软件是开发者和逆向工程师在处理Java字节码时的得力工具,它们能够将编译后的.class文件转换回可读性较高的源代码形式。这在理解已编译的Java程序、调试、分析或研究二进制代码时非常有用。本文将深入探讨...
Java反汇编是将Java字节码转换为人类可读的源代码表示的过程,这对于理解已编译的Java类文件的内部工作原理、调试、逆向工程或教学都非常有用。在Java领域,JVM(Java虚拟机)执行的是字节码,这是一种中间语言,而...
总的来说,Java反汇编是Java开发者的一项重要技能,它让我们能够更深入地洞察代码的运行过程,从而提高我们的编程能力和问题解决能力。而JavaClassViewer.binary可能是用于图形化展示Java类文件反汇编结果的工具,它...
本文将深入探讨HSDis工具、HotSpot虚拟机以及反汇编在JVM中的应用。 HSDis全称为HotSpot Disassembler,是一个二进制转汇编的工具。它能够将JIT编译后的机器码转换为可读的汇编代码,这对于分析和调试JVM内部行为...
`javap`是Java虚拟机(JVM)的一部分,通过反编译Class文件,我们可以看到方法的原始字节码以及解释为的汇编指令。这个工具对于性能调优、理解和分析JVM的工作机制非常有用。 使用`javap`的基本语法是: ```bash ...
在Java平台中,源代码被编译成字节码,这是一种中间语言,可以在Java虚拟机(JVM)上运行。反汇编工具将这些不可读的字节码转换为更接近高级语言的形式,使得分析和调试变得更加容易。 标题“java反汇编工具”暗示...
通过反汇编,开发者可以更好地分析代码执行流程,定位性能瓶颈,以及在没有源码的情况下理解二进制类文件的行为。此外,这些知识对于编写JIT编译器、开发字节码级别的工具(如动态代理库)或者进行安全分析等高级...
1. **理解字节码**:字节码是Java程序在JVM上的执行形式,反汇编后可以直观地看到这些指令,帮助开发者了解程序的运行流程。 2. **调试问题**:当遇到难以追踪的错误时,查看字节码可以帮助定位问题所在,尤其是在...
hsdis-amd64.dll是一款用于Java HotSpot虚拟机(JVM)的反汇编插件,主要用于帮助开发者查看和理解Java字节码在实际执行时如何被转换为机器码的过程。这款插件是开源的,并且是Java开发工具集(JDK)的一部分,对于...
Java反汇编是将已编译的字节码文件(.class文件)转换为人类可读的源代码表示形式的过程,这对于理解Java类文件的工作原理、逆向工程、调试和性能优化都非常重要。jclasslib是一款强大的GUI工具,它允许开发者深入...
可以使用`javap`工具来反汇编已编译的Java类文件,查看字节码指令。例如,如果想要检查`X.class`文件中的字节码,可以使用命令: ```bash % javap -c X.class ``` ##### main()函数的局部变量部分 `main()`函数...
- **jad**:JaCoCo的反汇编器,提供了更详细的字节码分析功能。 - **IntelliJ IDEA或Eclipse插件**:这些集成开发环境通常有内置的字节码查看器,方便在调试过程中查看字节码。 ### 4. 优化JVM指令 通过优化JVM...
在Java源代码编译成.class文件后,其中包含的Java字节码指令可通过Java的反汇编工具(如javap)转换为人类可读的文本形式。本手册将指导读者理解这些字节码指令的意义以及它们如何操作Java虚拟机的栈、局部变量、...
例如,`javap`是Java自带的反汇编工具,可以查看编译后的字节码和相关的元数据。通过`javap -c TestClass`,我们可以看到TestClass类的方法定义和字节码指令。 另外,` jclasslib`是一款可视化的字节码查看器,它...
hsdis-amd64.dll的工作原理是,当JVM遇到一个新的方法要执行时,如果启用了字节码反汇编,它会调用该插件将字节码反汇编成AMD64架构的汇编代码。这个插件不仅提供了反汇编服务,还包含了一些用于解释Java字节码到...
6. **JVM优化**:JVM提供了多种工具和选项来查看和调整其行为,如`javap`用于反汇编字节码,`-verbose:gc`用于输出GC日志,`-XX:`系列参数可以调整JVM的内存设置、垃圾收集策略等。 了解JVM的底层原理对于Java...
Java的类文件由一系列固定格式组成,如`javap -c CompileClass.class`用于反汇编类文件。`ClassFile`结构包含魔法数字、版本号、常量池、访问标志、类和超类信息等。字节码指令由操作码和操作数构成,虚拟机采用操作...
hsdis.dll是特定于Java的一个动态链接库,全称为HotSpot Service Disassembler,它是Oracle JDK中用于Java字节码反汇编的工具,尤其对于理解和调试Java虚拟机(JVM)的行为非常有帮助。 hsdis.dll的工作原理是将...