`
Anddy
  • 浏览: 191136 次
  • 性别: 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

相关推荐

    synchronize底层实现原理

    synchronize底层实现原理 Java文件想要看字节码通常使用 javap 命令将java的class文件反汇编,具体操作步骤如下:...经过以上3步骤,你会看到一些字节码指令,其实这才是最终运行在jvm上的机器指令代码。 public class

    android反编译(dex2jar.zip)

    1. 假设你要反汇编的是app.apk,那么先改名成app.zip 2. 解压 3. 在解压出来的里面找到classes.dex,这个就是目标的程序的二进制文件 4. 用附件的dex2jar,在Windows命令行下运行 dex2jar classes.dex 5. 生成...

    JAVA 开发环境 Java SE Development Kit (JDK) 16.0.1 x64.zip

    其他工具包括反汇编程序,启动程序,调试器,Java 命令行脚本外壳或策略创建和管理实用程序。 大眼仔(www.dayanzai.me)在这里提示的是,Java 开发工具包集成了一组功能强大的工具,无论其知识水平如何,它们都...

    jdk1.6 windows 64位

    Javap:Java反汇编器,显示编译类文件中的可访问功能和数据,同时显示字节代码含义。 Jconsole: Java进行系统调试和监控的工具常用的package java.lang: 这个是系统的基础类,比如String等都是这里面的,这个...

    JAVA 开发环境 Java SE Development Kit (JDK) 16.0.1 x64 免费下载.zip

    其他工具包括反汇编程序,启动程序,调试器,Java 命令行脚本外壳或策略创建和管理实用程序。 大眼仔在这里提示的是,Java 开发工具包集成了一组功能强大的工具,无论其知识水平如何,它们都可以帮助程序员实现 Java...

    Java虚拟机

    4.2.7 HSDIS:JIT生成代码反汇编 4.3 JDK的可视化工具 4.3.1 JConsole:Java监视与管理控制台 4.3.2 VisualVM:多合一故障处理工具 4.4 本章小结 第5章 调优案例分析与实战 5.1 概述 5.2 案例分析 5.2.1 高...

    JAVA上百实例源码以及开源项目源代码

    Java二进制IO类与文件复制操作实例 16个目标文件 内容索引:Java源码,初学实例,二进制,文件复制 Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系...

    JAVA上百实例源码以及开源项目

     Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码,...

    java开源包8

    目前它包含一个完整的虚拟机以及一个 javap 字节码反汇编器。 brap(Java远程调用框架 BRAP) 一个Java远程调用框架,它将原生Java对象序列化压缩装入HTTP中。它是 Spring HttpInvoker的一个轻量级选择,特别适合于当...

    java开源包10

    目前它包含一个完整的虚拟机以及一个 javap 字节码反汇编器。 brap(Java远程调用框架 BRAP) 一个Java远程调用框架,它将原生Java对象序列化压缩装入HTTP中。它是 Spring HttpInvoker的一个轻量级选择,特别适合于当...

    JAVA基础课程讲义

    汇编语言 10 高级语言 10 其他高级语言 11 JAVA发展简史 12 JAVA为什么能够流行? 13 JAVA各版本的含义 13 JAVA技术体系架构 14 JAVA的特性和优势 14 JAVA应用程序的运行机制 15 JVM(JAVA VIRTUAL MACHINE) 16 Java...

    java开源包1

    目前它包含一个完整的虚拟机以及一个 javap 字节码反汇编器。 brap(Java远程调用框架 BRAP) 一个Java远程调用框架,它将原生Java对象序列化压缩装入HTTP中。它是 Spring HttpInvoker的一个轻量级选择,特别适合于当...

    java开源包11

    目前它包含一个完整的虚拟机以及一个 javap 字节码反汇编器。 brap(Java远程调用框架 BRAP) 一个Java远程调用框架,它将原生Java对象序列化压缩装入HTTP中。它是 Spring HttpInvoker的一个轻量级选择,特别适合于当...

    java开源包2

    目前它包含一个完整的虚拟机以及一个 javap 字节码反汇编器。 brap(Java远程调用框架 BRAP) 一个Java远程调用框架,它将原生Java对象序列化压缩装入HTTP中。它是 Spring HttpInvoker的一个轻量级选择,特别适合于当...

    java开源包3

    目前它包含一个完整的虚拟机以及一个 javap 字节码反汇编器。 brap(Java远程调用框架 BRAP) 一个Java远程调用框架,它将原生Java对象序列化压缩装入HTTP中。它是 Spring HttpInvoker的一个轻量级选择,特别适合于当...

    java开源包6

    目前它包含一个完整的虚拟机以及一个 javap 字节码反汇编器。 brap(Java远程调用框架 BRAP) 一个Java远程调用框架,它将原生Java对象序列化压缩装入HTTP中。它是 Spring HttpInvoker的一个轻量级选择,特别适合于当...

    java开源包5

    目前它包含一个完整的虚拟机以及一个 javap 字节码反汇编器。 brap(Java远程调用框架 BRAP) 一个Java远程调用框架,它将原生Java对象序列化压缩装入HTTP中。它是 Spring HttpInvoker的一个轻量级选择,特别适合于当...

    java开源包4

    目前它包含一个完整的虚拟机以及一个 javap 字节码反汇编器。 brap(Java远程调用框架 BRAP) 一个Java远程调用框架,它将原生Java对象序列化压缩装入HTTP中。它是 Spring HttpInvoker的一个轻量级选择,特别适合于当...

    java开源包7

    目前它包含一个完整的虚拟机以及一个 javap 字节码反汇编器。 brap(Java远程调用框架 BRAP) 一个Java远程调用框架,它将原生Java对象序列化压缩装入HTTP中。它是 Spring HttpInvoker的一个轻量级选择,特别适合于当...

Global site tag (gtag.js) - Google Analytics