java虚拟机

Java虚拟机和真实的计算机一样,运行的都是二进制的机器码;而我们将.java 源代码编译成.class 文件,class文件便是Java虚拟机能够认识的二进制机器码,Java能够识别class文件中的信息和机器指令,进而执行这些机器指令。

实际上class文件中的Java虚拟机代码只会出现数字形式的操作码,不会出现助记符。

java虚拟机原理

《Java虚拟机原理图解》 1.1、class文件基本组织结构

《Java虚拟机原理图解》 1.2、class文件中的常量池

《Java虚拟机原理图解》 1.2.2、Class文件中的常量池详解(上)

《Java虚拟机原理图解》 1.2.3、Class文件中的常量池详解(下)

《Java虚拟机原理图解》1.3、class文件中的访问标志、类索引、父类索引、接口索引集合

《Java虚拟机原理图解》1.4 class文件中的字段表集合–field字段在class文件中是怎样组织的

《Java虚拟机原理图解》1.5、 class文件中的方法表集合–method方法在class文件中是怎样组织的

《Java虚拟机原理图解》3、JVM运行时数据区

《Java虚拟机原理图解》4.JVM机器指令集

《Java虚拟机原理图解》5. JVM类加载器机制与类加载过程

javap命令
javap命令常用来对java类文件来进行反编译(将机器指令转为汇编语言),主要用来对java进行分析的工具,在学习Thinking in Java时,由于需要对类文件反编译,以查看jvm到底对我们写的代码做了哪些优化和处理,比如我看的使用+=对字符串进行拼接时,jvm的处理方式。

javap的基本用法

语法:
  javap [ 命令选项 ] class. . .
  javap 命令用于解析类文件。其输出取决于所用的选项。若没有使用选项,javap 将输出传递给它的类的 public 域及方法。javap 将其输出到标准输出设备上。
命令选项
  -help 输出 javap 的帮助信息。
  -l 输出行及局部变量表。
  -b 确保与 JDK 1.1 javap 的向后兼容性。
  -public 只显示 public 类及成员。
  -protected 只显示 protected 和 public 类及成员。
  -package 只显示包、protected 和 public 类及成员。这是缺省设置。
  -private 显示所有类和成员。
  -J[flag] 直接将 flag 传给运行时系统。
  -s 输出内部类型签名。
  -c 输出类中各方法的未解析的代码,即构成 Java 字节码的指令。
  -verbose 输出堆栈大小、各方法的 locals 及 args 数,以及class文件的编译版本
  -classpath[路径] 指定 javap 用来查找类的路径。如果设置了该选项,则它将覆盖缺省值或 CLASSPATH 环境变量。目录用冒号分隔。
  -bootclasspath[路径] 指定加载自举类所用的路径。缺省情况下,自举类是实现核心 Java 平台的类,位于 jrelib下面。
  -extdirs[dirs] 覆盖搜索安装方式扩展的位置。扩展的缺省位置是 jrelibext。

使用案例

1
2
3
4
5
6
7
8
public class TestMain
{

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

先编译TestMain为.class,然后命令 javap -c TestMain

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Compiled from "TestMain.java"
public class TestMain {
public TestMain();
Code:
0: aload_0
1: invokespecial #8 // Method java/lang/Object."<init>":()V
4: return

public static void main(java.lang.String[]);
Code:
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
}

为eclipse配置javap命令