第五章 调优案例分析与实践
1、-XX:+PrintGCTimeStamps 打印GC停顿时间
第六章 类文件结构
1、Class文件是一组以8位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列在Class文件之中,中间没有添加任何分配符,这使得整个Class文件中存储的内容几乎全部都是程序运行的必要数据,没有空隙存在。当遇到需要占用8位字节以上空间的数据项时,则会按照高位在前的方式分割成若干个8位字节进行存储。
Class文件只有两种数据类型:无符号数和表。无符号数属于基本的数据类型,以u1,u2,u4,u8来分别代表1个字节、2个字节、4个字节和8个字节的无符号数,无符号数可以用来描述数字、索引引用、数量值,或者按照UTF-8编码构成字符串值。表是由多个无符号数或其他表作为数据项构成的复合数据类型,所有表都习惯性地以“_info”结尾。
Class文件格式
类型 名称 数量
u4 magic 1
u2 minor_version 1
u2 major_version 1
u2 constant_pool_count 1
cp_info constant_pool constant_pool_count -1
u2 access_flags 1
u2 this_class 1
u2 super_class 1
u2 interfaces_count 1
u2 interfaces interfaces_count
u2 fields_count 1
field_info fields fields_count
u2 methods_count 1
method_info methods methods_count
u2 attributes_count 1
attribute_info attributes attributes_count
6.1魔数与Class文件的版本
每个Class文件的头4个字节称为魔数(Magic Number),它唯一的作用是用于确定这个文件是否为一个能被虚拟机接受的Class文件。值为:0xCAFEBABE.紧接着魔数的4个字节存储的是Class文件的版本号:第5和第6个字节是次版本号(Minor Version),第7个和第8个字节是主版本号(Major Version)。从45开始,高版本的JDK能向下兼容以前版本的Class文件,但不能运行以后版本的Class文件,即使文件格式并未发生变化。
6.2常量池
紧挨着主次版本号之后的是常量池入口,是第一个出现的表类型数据项目,常量数量不固定,常量池容量计数值是从1而不是0开始的,如计数为22,索引值为1-21,将第0项常量空出来是有特殊考虑的,这样做是为了满足后面某些指向常量池的索引值的数据在特定情况下需要表达“不引用任何一个常量池项目”的意思,这种情况就可以把索引置为0来表示。其它集合类型都是从0开始的。
常量分为:字面量(Literal)和符号引用(Symbolic References)。字面量如文本字符串、被声明为final的常量值等;符号引用包括:类和接口的全限定名(Fully Qualified Name)、字段的名称和描述符(Descriptor)、方法的名称和描述符。
6.3 访问标志
在常量池结束之后,紧接着的2个字节代表访问标志(access_flags),这个标志用于识别一些类或接口层次的访问信息,包括:这个Class是类还是接口;是否定义为public类型;是否定义为abstract类型;如果是类的话是否被声明为final,等等。
6.4类索引、父类索引与接口索引集合
类索引和父类索引都是一个u2类型的数据,而接口索引集合是一组u2类型的数据集合,Class文件中由这三项数据来确定这个类的继承关系。
6.5字段表集合
字段表用于描述接口或类中声明的变量。描述一个字段可以包括的信息有:字段的作用域(public,private,protected修改符)、是类级变量还是实例级变量(static修饰符)、可变性(final)、并发可见性(volatile修饰符,是否强制从主内存读写)、可否序列化(transient修饰符)、字段数据类型、字段名称。
描述符标识字符含义
B 基本类型byte
C 基本类型char
D 基本类型double
F 基本类型float
I 基本类型int
J 基本类型long
S 基本类型short
Z 基本类型boolean
V 特殊类型void
L 对象类型,如Ljava/lang/Object;
对于数组类型,每一维度将使用一个前置的“[”字符来描述。
6.6ConstantValue属性
作用是通知虚拟机自动为静态变量赋值,只有被static关键字修饰的变量才可能使用这项属性。
6.7InnerClasses属性
用于记录内部类一宿主类之间的关联。
6.8Deprecated及Synthetic属性
deprecated和Synthetic两个属性都属于标志类型的布尔属性。
分享到:
相关推荐
深入理解Java虚拟机学习笔记借鉴.pdf
java 虚拟机
Java虚拟机----类的加载过程.docx
虚拟机学习笔记--周志明老师第三版
作者以易于理解的方式深入揭示了java虚拟机的内部工作原理,深入理解这些内容,将对读者更快速地编写更高效的程序大有裨益! 本书共分20章,第1-4章解释了java虚拟机的体系结构,包括java栈、堆、方法区、执行...
深入Java虚拟机——本地方法栈.pdf
虚拟机是一种抽象化的计算机,通过在实际的计算机上仿真模拟各种...Java虚拟机屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。
深入理解java虚拟机视频教程,jvm原理,java虚拟机,jvm性能调优,内存模型,gc工作原理,内存分配,类的加载等等视频教程
马士兵jvm调优参考资源
深入理解Java虚拟机笔记(带目录).docx
深入理解Java虚拟机--类加载及执行子系统的案例与实战xmind文件
深入理解Java虚拟机(第二版)
诸葛_BAT面试之深入理解Java虚拟机_9
深入理解JAVA虚拟机.xmind
深入Java虚拟机英文版第二版,很清晰,包含目录,只是不能点击标题跳转
前言Java是目前用户最多、使用范围最广的软件开发技术之一。Java的技术体系主要由支撑Java程序运行的虚拟机、提供各开发领域接口支持的Java API、Ja
了解jvm的pdf,高清pdf,希望大家下载
自己看《深入理解Java虚拟机》(第二版)所做的一些笔记。因为个人水平有限,能够理解的也只有前面几章的内容,后面的内容觉得看了也不是很理解,就没有记在里面。希望能对大家有所帮助,也希望能和大家一起进步。
这里我们使用举例来说明为什么要学习Java虚拟机,其实这个问题就和为什么要学习数据结构和算法是一个道理,工欲善其事,必先利其器。曾经的我经常害怕处理内存溢出的问题,因为不知道他为什么会出现这个问题,当我在...
介绍java虚拟机的组成,工作机制。本书介绍的较为详细,概念偏多,适合入门了解,文档排版优秀