JVM学习三

简介: 2.编译javap通过javap工具,我么可以反编译class文件,从而看到java的字节码信息:javap -v xxx.class从字节码文件中,我们可以看到类的文件的相关信息,版本信息、字段、常量池信息、属性信息、方法信息,继承信息和标识信息等。通常原始java代码,编译后变成字节码文件,常量信息,会放入常量池中,运行时放入到运行时常量池中。而运行常量池类似hash表,在里面可以看到里面的常量的信息。方法字节码载入方法区,main线程开始运行,分配栈帧内存。而栈帧的数据结构是栈,先进后出的特点。接着执行引擎完成字节码操作。在编译过程期间,会自动生成和转换一些代码,方便运行。

1.类文件结构

通常一个java文件,编译之后会变成字节码文件。根据jvm规范,类文件的结构如下:

classFile{  

           u4magic; #魔数,表示其是否是类文件,0-3字节,cafebabe  

           u2minor_version; #版本,4-7字节,类的版本,其中34表示java8    

           u2major_version; #主版本,  

           u2constant_pool_count; #常量池,8-9字节,量池长度  

           cp_infoconstant_pool[constant_pool_count-1]; #常量池信息

           u2access_flags; #访问标记

           u2super_class; #父类信息  

           u2interfaces_count;#接口信息    

           u2interfaces[interfaces_count];    

           u2fields_count; #字段信息,成员变量信息    

           field_infofileds[fields_count];    

           u2methodsCount; #方法信息    

           method_infomethods[methoos_count];    

           u2attributes_count; #属性信息    

           attribute_infoattributes[attributes_count];

      }    


2.编译javap

通过javap工具,我么可以反编译class文件,从而看到java的字节码信息:

javap-vxxx.class

从字节码文件中,我们可以看到类的文件的相关信息,版本信息、字段、常量池信息、属性信息、方法信息,继承信息和标识信息等。

通常原始java代码,编译后变成字节码文件,常量信息,会放入常量池中,运行时放入到运行时常量池中。而运行常量池类似hash表,在里面可以看到里面的常量的信息。方法字节码载入方法区,main线程开始运行,分配栈帧内存。而栈帧的数据结构是栈,先进后出的特点。接着执行引擎完成字节码操作。

在编译过程期间,会自动生成和转换一些代码,方便运行。

3.类加载阶段

加载

将类的字节码载入方法区中,内部采用C++的instanceKlass描述java类,相关字段:

_java_mirror#java的类镜像,方便java使用

_super#父类

_fields#成员变量

_methods#方法

_constants#常量池

_class_loader#类加载器

_vtable#虚方法表

_itable#接口方法表

如果这个类还有父类没有加载,先加载父类。同时加载和链接可以交替运行的。

链接

链接的过程中,需要进行验证、准备、解析工作。

其中:

  验证时验证类是否符合jvm规范,安全性检查

  准备是为static变量分配空间,设置默认值

  将常量池中的符号引用解析为直接引用

初始化

<cinit>() v 方法,初始化即调用<cinit>() v,虚拟机会保证这个类的构造方法的线程安全。

发生的时机:类的初始化时惰性的。main方法所在的类总会被首先初始化,首次访问这个方法的静态变量或静态方法,子类初始化,如果父类还没有初始化,则会子类访问父类的静态变量,触发父类的初始化。class.forName,new会导致初始化等。

不会触发初始化的情况:

访问static final静态常量、访问类对象的.class、创建该类的数组等。

4.类加载器

BootstrapClassLoader:加载java_home的lib信息

ExtensionClassLoader:加载java_home中的lib/ext中的信息

ApplicationClassLoader:加载应用的classpath的信息

自定义类加载器:自定义路径的信息

上面的四种类加载器存在上下级关系。同时从源码里面会看到其涉及双亲委派模式。

双亲委派模式:调用类加载器的loadClass方法时,查找类的规则。

查看此类是否已经加载,有上级的话,委派上级ExtClassLoader的loadClass,如果没有上级,则委派BootstrapClassLoader。如果每一层找不到,则找自定义类加载器加载。

什么时候我们会用到自定义类加载器:

1.想加载非classpath随意路径中的类文件

2.都是通过接口来使用实现,希望解耦时,常用在框架设计

3.这些类希望予以隔离,不同应用的同名类都可以加载,不冲突,常见于tomcat容器中

目录
相关文章
|
6月前
|
Oracle Java 编译器
基本概念【入门、 发展简史、核心优势、各版本的含义、特性和优势、JVM、JRE 和 JDK 】(二)-全面详解(学习总结---从入门到深化)
基本概念【入门、 发展简史、核心优势、各版本的含义、特性和优势、JVM、JRE 和 JDK 】(二)-全面详解(学习总结---从入门到深化)
84 1
|
1月前
|
缓存 算法 Java
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
这篇文章详细介绍了Java虚拟机(JVM)中的垃圾回收机制,包括垃圾的定义、垃圾回收算法、堆内存的逻辑分区、对象的内存分配和回收过程,以及不同垃圾回收器的工作原理和参数设置。
61 4
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
|
1月前
|
存储 SQL 小程序
JVM知识体系学习五:Java Runtime Data Area and JVM Instruction (java运行时数据区域和java指令(大约200多条,这里就将一些简单的指令和学习))
这篇文章详细介绍了Java虚拟机(JVM)的运行时数据区域和JVM指令集,包括程序计数器、虚拟机栈、本地方法栈、直接内存、方法区和堆,以及栈帧的组成部分和执行流程。
31 2
JVM知识体系学习五:Java Runtime Data Area and JVM Instruction (java运行时数据区域和java指令(大约200多条,这里就将一些简单的指令和学习))
|
1月前
|
Java 应用服务中间件 程序员
JVM知识体系学习八:OOM的案例(承接上篇博文,可以作为面试中的案例)
这篇文章通过多个案例深入探讨了Java虚拟机(JVM)中的内存溢出问题,涵盖了堆内存、方法区、直接内存和栈内存溢出的原因、诊断方法和解决方案,并讨论了不同JDK版本垃圾回收器的变化。
29 4
|
1月前
|
Arthas 监控 Java
JVM知识体系学习七:了解JVM常用命令行参数、GC日志详解、调优三大方面(JVM规划和预调优、优化JVM环境、JVM运行出现的各种问题)、Arthas
这篇文章全面介绍了JVM的命令行参数、GC日志分析以及性能调优的各个方面,包括监控工具使用和实际案例分析。
43 3
|
1月前
|
SQL 缓存 Java
JVM知识体系学习三:class文件初始化过程、硬件层数据一致性(硬件层)、缓存行、指令乱序执行问题、如何保证不乱序(volatile等)
这篇文章详细介绍了JVM中类文件的初始化过程、硬件层面的数据一致性问题、缓存行和伪共享、指令乱序执行问题,以及如何通过`volatile`关键字和`synchronized`关键字来保证数据的有序性和可见性。
28 3
|
1月前
|
缓存 前端开发 Java
JVM知识体系学习二:ClassLoader 类加载器、类加载器层次、类过载过程之双亲委派机制、类加载范围、自定义类加载器、编译器、懒加载模式、打破双亲委派机制
这篇文章详细介绍了JVM中ClassLoader的工作原理,包括类加载器的层次结构、双亲委派机制、类加载过程、自定义类加载器的实现,以及如何打破双亲委派机制来实现热部署等功能。
42 3
|
1月前
|
存储 Java
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
这篇文章详细地介绍了Java对象的创建过程、内存布局、对象头的MarkWord、对象的定位方式以及对象的分配策略,并深入探讨了happens-before原则以确保多线程环境下的正确同步。
53 0
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
|
1月前
|
小程序 Oracle Java
JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
这篇文章是关于JVM基础知识的介绍,包括JVM的跨平台和跨语言特性、Class文件格式的详细解析,以及如何使用javap和jclasslib工具来分析Class文件。
41 0
JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
|
5月前
|
缓存 Java
《JVM由浅入深学习九】 2024-01-15》JVM由简入深学习提升分(生产项目内存飙升分析)
《JVM由浅入深学习九】 2024-01-15》JVM由简入深学习提升分(生产项目内存飙升分析)
50 0