如何检查Java代码的汇编输出?

时间:2015-06-19 02:05:07

标签: java assembly

我发现这个问题为C ++解答了这个问题:
How do you get assembler output from C/C++ source in gcc?

2 个答案:

答案 0 :(得分:3)

Java使用字节码。最相似的是javap,根据链接的Oracle文档, javap 命令反汇编一个或多个类文件。其输出取决于使用的选项。

package com.stackoverflow;

class Main {
    public static void main(String[] args) {
        System.out.println("Hello, World!");
    }
}

如果我将其编译为Main.class,然后运行javap -v Main.class

Classfile /home/efrisch/workspace/StackOverflow/bin/com/stackoverflow/Main.class
  Last modified Jun 18, 2015; size 553 bytes
  MD5 checksum de4f987e783aa0f145e7245269504028
  Compiled from "Main.java"
class com.stackoverflow.Main
  minor version: 0
  major version: 52
  flags: ACC_SUPER
Constant pool:
   #1 = Class              #2             // com/stackoverflow/Main
   #2 = Utf8               com/stackoverflow/Main
   #3 = Class              #4             // java/lang/Object
   #4 = Utf8               java/lang/Object
   #5 = Utf8               <init>
   #6 = Utf8               ()V
   #7 = Utf8               Code
   #8 = Methodref          #3.#9          // java/lang/Object."<init>":()V
   #9 = NameAndType        #5:#6          // "<init>":()V
  #10 = Utf8               LineNumberTable
  #11 = Utf8               LocalVariableTable
  #12 = Utf8               this
  #13 = Utf8               Lcom/stackoverflow/Main;
  #14 = Utf8               main
  #15 = Utf8               ([Ljava/lang/String;)V
  #16 = Fieldref           #17.#19        // java/lang/System.out:Ljava/io/PrintStream;
  #17 = Class              #18            // java/lang/System
  #18 = Utf8               java/lang/System
  #19 = NameAndType        #20:#21        // out:Ljava/io/PrintStream;
  #20 = Utf8               out
  #21 = Utf8               Ljava/io/PrintStream;
  #22 = String             #23            // Hello, World!
  #23 = Utf8               Hello, World!
  #24 = Methodref          #25.#27        // java/io/PrintStream.println:(Ljava/lang/String;)V
  #25 = Class              #26            // java/io/PrintStream
  #26 = Utf8               java/io/PrintStream
  #27 = NameAndType        #28:#29        // println:(Ljava/lang/String;)V
  #28 = Utf8               println
  #29 = Utf8               (Ljava/lang/String;)V
  #30 = Utf8               args
  #31 = Utf8               [Ljava/lang/String;
  #32 = Utf8               SourceFile
  #33 = Utf8               Main.java
{
  com.stackoverflow.Main();
    descriptor: ()V
    flags:
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0
         1: invokespecial #8                  // Method java/lang/Object."<init>":()V
         4: return
      LineNumberTable:
        line 3: 0
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0       5     0  this   Lcom/stackoverflow/Main;

  public static void main(java.lang.String[]);
    descriptor: ([Ljava/lang/String;)V
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=2, locals=1, args_size=1
         0: getstatic     #16                 // Field java/lang/System.out:Ljava/io/PrintStream;
         3: ldc           #22                 // String Hello, World!
         5: invokevirtual #24                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
         8: return
      LineNumberTable:
        line 5: 0
        line 6: 8
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0       9     0  args   [Ljava/lang/String;
}
SourceFile: "Main.java"

答案 1 :(得分:2)

Java使用字节码和汇编语言。这是一个两步的过程。第一步是将Java源代码编译为字节码,正如@ elliott-frisch所指出的那样。在运行时,JVM会监视程序的哪些部分被大量使用。如果方法“运行热”,则将其编译为汇编语言。反过来,这本身就是一个多步骤的过程,包括许多优化,并用更快的代码替换快速代码。几年前我在BeyondJava.net中对此进行了描述。

如果你可以节省45分钟,我也建议你看看Charles Nutter的演讲。 "Down the rabbit hole"是对Java如何编译汇编语言的一个很好的介绍。

至于你的问题:你必须在启动应用程序的命令中添加一些参数:

Value I want

您还必须下载一个特殊的DLL并将其存储在jre文件夹中。另请参阅Chris Newlands article有关如何为OS X编译此文件的信息。