`
wang7839186
  • 浏览: 40733 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

jvm学习第三天

    博客分类:
  • java
阅读更多

今天工作有点忙,没时间学习了,赶紧补上吧。

昨天开始学习class文件结构,今天继续。

一、class类文件结构

Class文件是一组以8位字节为基础单位的二进制流。

根据java虚拟机的规定,Class文件格式采用一种类似于C语言结构体的微结构来存储,这种伪结构只有两种数据类型:无符号数和表。

 

1、魔数与Class文件的版本,下面是从ue中拷贝出来的十六进制片段

 

 

package com.struts.action;

public class TestClass {
	private int m;
	
	public int inc(){
		return m+1;
	}
}
 

 

00000000h: CA FE BA BE 00 00 00 32 00 16 07 00 02 01 00 1B ; 漱壕...2........

00000010h: 63 6F 6D 2F 73 74 72 75 74 73 2F 61 63 74 69 6F ; com/struts/actio

00000020h: 6E 2F 54 65 73 74 43 6C 61 73 73 07 00 04 01 00 ; n/TestClass.....

00000030h: 10 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 ; .java/lang/Objec

00000040h: 74 01 00 01 6D 01 00 01 49 01 00 06 3C 69 6E 69 ; t...m...I...<ini

00000050h: 74 3E 01 00 03 28 29 56 01 00 04 43 6F 64 65 0A ; t>...()V...Code.

00000060h: 00 03 00 0B 0C 00 07 00 08 01 00 0F 4C 69 6E 65 ; ............Line

00000070h: 4E 75 6D 62 65 72 54 61 62 6C 65 01 00 12 4C 6F ; NumberTable...Lo

00000080h: 63 61 6C 56 61 72 69 61 62 6C 65 54 61 62 6C 65 ; calVariableTable

00000090h: 01 00 04 74 68 69 73 01 00 1D 4C 63 6F 6D 2F 73 ; ...this...Lcom/s

000000a0h: 74 72 75 74 73 2F 61 63 74 69 6F 6E 2F 54 65 73 ; truts/action/Tes

000000b0h: 74 43 6C 61 73 73 3B 01 00 03 69 6E 63 01 00 03 ; tClass;...inc...

000000c0h: 28 29 49 09 00 01 00 13 0C 00 05 00 06 01 00 0A ; ()I.............

000000d0h: 53 6F 75 72 63 65 46 69 6C 65 01 00 0E 54 65 73 ; SourceFile...Tes

000000e0h: 74 43 6C 61 73 73 2E 6A 61 76 61 00 21 00 01 00 ; tClass.java.!...

000000f0h: 03 00 00 00 01 00 02 00 05 00 06 00 00 00 02 00 ; ................

00000100h: 01 00 07 00 08 00 01 00 09 00 00 00 2F 00 01 00 ; ............/...

00000110h: 01 00 00 00 05 2A B7 00 0A B1 00 00 00 02 00 0C ; .....*?.?.....

00000120h: 00 00 00 06 00 01 00 00 00 03 00 0D 00 00 00 0C ; ................

00000130h: 00 01 00 00 00 05 00 0E 00 0F 00 00 00 01 00 10 ; ................

00000140h: 00 11 00 01 00 09 00 00 00 31 00 02 00 01 00 00 ; .........1......

00000150h: 00 07 2A B4 00 12 04 60 AC 00 00 00 02 00 0C 00 ; ..*?..`?......

00000160h: 00 00 06 00 01 00 00 00 07 00 0D 00 00 00 0C 00 ; ................

00000170h: 01 00 00 00 07 00 0E 00 0F 00 00 00 01 00 14 00 ; ................

00000180h: 00 00 02 00 15                                  ; .....

 

每个Class文件的头4个字节成为魔数,它的唯一作用是用于确定这个文件是否为一个能被虚拟机接受的class文件,很多文件标准都采用魔数身份识别,使用魔数而不是扩展名主要是为了安全考虑,因为文件扩展名可以被随意的改动。

 

哈哈,发现一件很有意思的事情,class文件的前四个字节是 0xCAFEBABE(咖啡宝贝)。

 

我们来分析一行Class文件用ue打开后的十六进制内容吧:

CA FE BA BE 00 00 00 32

前四个字节标示它是Class格式的,第五和第六标示次版本号,而主版本号的值为0x0032,即十进制的50,该版本号说明这个是可以被jdk1.6以上版本的虚拟机执行的Class文件。

 

2、常量池

常量池紧跟在主次版本之后,由于常量池中常量的数量是不固定的,所以在常量池的入口需要放置一项u2类型的数据,也就是两个字节的数据,代表常量池计数值。0x0016,即十进制的22,代表常量池中有21项常量。

 

常量池中主要存放两大类常量:字面量和符号引用,字面量比较接近java语言层面的常量概念,如文本字符串,被生命为final的常量值等,而符号引用则属于编译原理方面的概念,包括下面三类:

(1)类和接口的全限定名

(2)字段的名称和描述符

(3)方法的名称和描述符

 

其它的推倒就不再累述,也没有细看,总之,十六进制格式字符对应前面所说的表里面的数据,都是有意义的,最终都可以翻译成原生的java文件。

 

二、虚拟机类加载机制

虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的java类型,这就是虚拟机的类加载机制。

 

在java语言里面,类型的加载和连接过程都是在程序运行期间完成的,这样会在类加载时稍微增加一点开销,但是却能为java应用程序提供高度的灵活性,java中天生可以动态扩展的语言特性就是依赖运行期动态加载和动态连接这个特点实现的。

 

类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括了:加载,验证、准备、解析、初始化、使用和卸载七个阶段。其中验证准备和解析统称为连接。

 

对于初始化阶段,虚拟机规定了有且只有这四种情况,需要对类进行初始化(加载,验证,准备自然需要在此之前开始)

 

(1)遇到new、getstatic、putstatic或invokestatic这四条指令码,生成这四条指令码最常见的java代码场景是:使用new关键字实例化对象、读取或设置一个类的静态字段(被final修饰,已在编译期把结果放入常量池的静态字段除外),以及调用一个类的静态方法的时候。

(2)使用java.lang.reflect包的方法对类进行反射调用的时候

(3)当初始化一个类的时候,如果发现父类还没有进行初始化,则需要先出发其父类的初始化

(4)当虚拟机启动时,用户需要指定一个要执行的主类(包括main()方法那个类),虚拟机会先初始化这个主类。

分享到:
评论

相关推荐

    JVM入门实战/arthas实战/垃圾回收算法/垃圾回收器/jvm内存模型分析

    第三节:定位垃圾对象的依据 1.1 引用计数法 1.2 可达性算法 第四节:垃圾回收算法 1.1标记清除算法 1.2复制算法 1.3 标记整理(标记压缩)算法 第五节:垃圾回收器 1.1Serial/Serial Old收集器 1.2 ParNew收集...

    Java进阶教程解密JVM视频教程

    第三章:垃圾回收 1. 如何判断对象可以回收 2. 垃圾回收算法 3. 分代垃圾回收 4. 垃圾回收器 5. 垃圾回收调优 第四章:类加载与字节码技术 1. 类文件结构 2. 字节码指令 3. 编译期处理 4. 类加载阶段 5. 类加载器 6...

    一次性精通JVM JAVA虚拟机

    第3章 类的加载、解释、编译,本章节带你深入理解类加载器的分类、范围、双亲委托策略,自己手写类加载器,理解字节码解释器、即时编译器、混合模式、热点代码检测、分层编译等核心知识。 第4章 内存模型,本章节...

    【隐匿的学习笔记】JVM(1) 类加载子系统

    松散了好久 回归状态 系统学习JVM 记个笔记 写点自己的理解 注: 博主所有博客内容的学习笔记都是从学习资料处学习得来,些许位置的思路会借鉴,但保证所有文章的所有内容(包括文字和图) 都是自己原创字是一个一个...

    java8rt.jar源码-JVM:学习JVM

    JVM的重要性不言而喻,这个是学习JVM是看视频和读《深入理解JVM》时做的一些笔记,用于复习参考。 读书笔记 第2章:java内存模型和内存溢出异常 1.运行时数据区域 1.程序计数器:线程私有 2.java虚拟机栈:线程私有...

    java高级特性整理资料(反射+并发+jvm)

    包含java三大高级特性的文档,《Java Reflection in Action》、《JAVA并发编程实战》、《JVM调优总结》、《深入理解Java虚拟机JVM高级特性与最佳实践》、《concurrent programming in java》,适合想深入java技术的...

    框架学习:计算机学习资料(Java,Jvm,Linux,Mysql,Netty,Redis,Netty,Spring,SpringBoot,Mybatis,Rabbitmq,计算机网络,数据结构与算法,设计模式)Github Web阅读guang19.github.ioframework-学习,Gitee网页版阅读:https:qsjzwithguang19forever.gitee.ioframework-learning

    Jdk&Jvm&Juc(待JVM第三版修改) 计算机基础 Linux 数据结构与算法 推荐一个数据结构与算法的可视化网站,希望能够帮到正在学习数据结构与算法的同学: 计算机网络 设计模式 数据库 关系型数据库 非关系型数据库...

    Java 并发编程原理与实战视频

    第3节解析多线程与多进程的联系以及上下文切换所导致资源浪费问题 [免费观看] 00:13:03分钟 | 第4节学习并发的四个阶段并推荐学习并发的资料 [免费观看] 00:09:13分钟 | 第5节线程的状态以及各状态之间的转换详解...

    JVM教程之内存管理和垃圾回收(三)

    主要介绍了JVM学习笔记的第三篇内存管理和垃圾回收,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    JAVA核心知识点全集

    第一章:jvm、第二章:java集合、第三章:java多线程并发、第四章:java基础、第五章:Spring原理、第六章:微服务、第七章:Netty 与 RPC、第八章:网络、第九章:日志、第十章:Zookeeper、第十一章:Kafka、第十...

    虚拟机学习笔记--周志明老师第三版

    虚拟机学习笔记--周志明老师第三版

    深入Java虚拟机(原书第2版)及书中源代码

    第3章 安全 第4章 网络移动性 第5章 Java虚拟机 第6章 Java class文件 第7章 类型的生命周期 第8章 连接模型 第9章 垃圾收集 第10章 栈和局部变量操作 第11章 类型转换 第12章 整数运算 第13章 逻辑运算 第14章 浮点...

    java jdk8 学习笔记

    C:\lib\abc.jar 指定jvm寻找.class文件路径的方法有三种,分别是从当前目录下寻找、某个文件夹下寻找或在链接库的jar文件中寻找。 同样,使用命令行指定classpath的方式优先于从系统读取classpath环境变量。 7...

    java后端学习推荐书籍清单

    《鸟哥的Linux私房菜基础篇第三版》 《深入浅出Spring Boot2》《图解Java多线程设计模式》 《深入理解Java虚拟机:JVM高级特性与最佳实践》 《深入理解计算机系统(原书第三版》《Netty权威指南 第2版》 《Netty 4...

    基础的java学习,学习过程的蜗牛,不断前行.rar

    Java 是一门面向对象编程语言,不仅吸收了 C++ 语言的各种优点,还摒弃了 C++ 里难以理解的多继承、指针等概念。...8.Java中JVM、JRE和JDK三者有什么区别和联系? 9.Java开发工具 10.Java Eclipse下载安装教程

    Java中高级核心知识全面解析(高频面试题) 中文PDF完整版

    第三部分 Linux 第四部分 数据结构与算法 第五部分 数据库(MySQL+Redis) 第六部分 系统设计(RestFul API+常用框架+认证授权+分布式+大型网站架构+微服务) 第七部分 必会工具(Git+Docker) 第八部分 面试指南...

    202006学习网址.zip

    fastjson是目前java语言中最快的json库,比自称最快的jackson速度要快,第三方独立测试结果看这里:https://github.com/eishay/jvm-serializers/wiki 这里有jackson作者cowtowncoder等人对fastjson的性能评价:...

    IBM SDK Java V8用户指南中文版(2019)

    IBM SDK Java Technology Edition V8用户指南中文版的PDF文档,共计364页,可以系统性的了解及学习IBM Java8及其相关的IBM Java虚拟机JVM,有助于优化项目和银行业相关实施运维工作 第1章:产品概述 第2章:迁移 ...

    java是什么.avi

    java学习第一天,讲解java是什么 本章学习要点 了解 Java 语言的版本及特点 了解学习 Java 的方法 掌握 JDK 的安装 掌握环境变量的配置 熟悉 Java 程序的编写、编译和运行过程 了解 Java 虚拟机的作用 熟悉 Java ...

Global site tag (gtag.js) - Google Analytics