zoukankan      html  css  js  c++  java
  • 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文件结构表

  • 相关阅读:
    使用牛顿迭代法和二分法求解一个数的平方根(python语言实现)
    厄拉多塞筛法和普通方法求素数表(python实现)
    使用辗转相除法求两个数的最大公因数(python实现)
    我在博客园第一篇博文
    Linux安装maven
    MyBatis基础入门
    Maven的使用入门
    nginx的简单使用和使用nginx在windows上搭建tomcat集群
    后端程序员如何玩转AJAX
    Servlet3.0文件上传
  • 原文地址:https://www.cnblogs.com/tc971121/p/13441405.html
Copyright © 2011-2022 走看看