1-jvm入门及class文件格式分析

一.java从编码到运行过程

  • .java文件经过编译器的编译后成为.class字节码文件,通过类加载器classloader加载到内存,然后通过字节码解释器解释或者即时编译器JIT编译,然后交给执行引擎进行执行,执行引擎再和os和硬件交互。

  • java 是跨平台的语言,Jvm是跨语言的平台。

![image-20200726145315409](/Users/zhangtianci/Library/Application Support/typora-user-images/image-20200726145315409.png)

  • jvm跟java无关:任何语言只要能编译成class文件都能在jvm上运行。


  • jvm是一种规范。

  • 虚构出来的一台计算机:字节码指令集/内存管理。

JDK/JRE/JVM 关系

二.class字节码文件格式分析

一个简单的java类:

package com.tc.javabase.jvm.bytecode;

/**
 * @Classname ByteCodeTest1
 * @Description TODO
 * @Date 2020/8/2 16:23
 * @Created by zhangtianci
 */
public class ByteCodeTest1 {
}

编译后的class字节码文件(16进制展示):

cafe babe 0000 0034 0010 0a00 0300 0d07
000e 0700 0f01 0006 3c69 6e69 743e 0100
0328 2956 0100 0443 6f64 6501 000f 4c69
6e65 4e75 6d62 6572 5461 626c 6501 0012
4c6f 6361 6c56 6172 6961 626c 6554 6162
6c65 0100 0474 6869 7301 002c 4c63 6f6d
2f74 632f 6a61 7661 6261 7365 2f6a 766d
2f62 7974 6563 6f64 652f 4279 7465 436f
6465 5465 7374 313b 0100 0a53 6f75 7263
6546 696c 6501 0012 4279 7465 436f 6465
5465 7374 312e 6a61 7661 0c00 0400 0501
002a 636f 6d2f 7463 2f6a 6176 6162 6173
652f 6a76 6d2f 6279 7465 636f 6465 2f42
7974 6543 6f64 6554 6573 7431 0100 106a
6176 612f 6c61 6e67 2f4f 626a 6563 7400
2100 0200 0300 0000 0000 0100 0100 0400
0500 0100 0600 0000 2f00 0100 0100 0000
052a b700 01b1 0000 0002 0007 0000 0006
0001 0000 0009 0008 0000 000c 0001 0000
0005 0009 000a 0000 0001 000b 0000 0002
000c 

我们来分析一个这个class文件

1-4个字节:CAFEBABE ,文件统一标识符,看到这个标识符,就知道这是一个class文件。

5-8个字节:00000034,0000这两个字节表示小版本号(minor version),0034这两个字节表示大版本号(major version)。(我是用jdk1.8编译对应的版本号用十进制表示为52.0)

9-10个字节:0010,constant_pool_count,常量池大小,此时表示有15个常量(16-1)。最大65535 个常量。

constant_pool/access_flags/this_class/super_class/interfaces_count/interfaces/fileds_count/fileds/

methods_count/methods/attributes_count/attributes 等信息对着本文最下方的class文件结构表来进行一一分析。

接下来我们借用一个class文件格式分析插件更直观的观察class文件的结构信息(javap/jclasslib等工具),我采用的是idea插件jclasslib来观察:

通过这个工具我们可以很直观的观察到class文件所包含的信息。

  • General Information

    Minor version: 小版本号

    major version: 大版本号

    Constant pool count: 常量池大小

    this class: 类的全限定名,存在常量池的#2位置

    super class:父的类的全限定名,存在常量池的#3位置

    Interfaces count:实现接口的数量。

    Fields count :字段数量

    Methods count :方法数量

    Attributes count

  • Constant pool 常量池

    包含CONSTANT_MethodRef_info/CONSTANT_Class_info/CONSTANT_utf-8_info等常量,具体包含什么东西可以对照着本文最下面的class文件结构表查询。

  • Interfaces

  • Fields

  • Methods

    包含所有的方法的详细信息。方法里面包含code指令以及局部变量表和行号表。

    关于code里面具体的指令分析后面文章会介绍。

  • Attributes

关于class文件结构的大概介绍就到这里来,具体还需要同学们自己下去动手去分析分析(对着class文件结构表)。

class文件结构表

原文地址:https://www.cnblogs.com/tc971121/p/13441405.html