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容器中

目录
相关文章
|
2月前
|
Oracle Java 编译器
基本概念【入门、 发展简史、核心优势、各版本的含义、特性和优势、JVM、JRE 和 JDK 】(二)-全面详解(学习总结---从入门到深化)
基本概念【入门、 发展简史、核心优势、各版本的含义、特性和优势、JVM、JRE 和 JDK 】(二)-全面详解(学习总结---从入门到深化)
47 1
|
3月前
|
Oracle IDE Java
基本概念【入门、 发展简史、核心优势、各版本的含义、特性和优势、JVM、JRE 和 JDK 】(二)-全面详解(学习总结---从入门到深化)(下)
基本概念【入门、 发展简史、核心优势、各版本的含义、特性和优势、JVM、JRE 和 JDK 】(二)-全面详解(学习总结---从入门到深化)
37 1
|
3月前
|
Java 程序员 PHP
基本概念【入门、 发展简史、核心优势、各版本的含义、特性和优势、JVM、JRE 和 JDK 】(二)-全面详解(学习总结---从入门到深化)(上)
基本概念【入门、 发展简史、核心优势、各版本的含义、特性和优势、JVM、JRE 和 JDK 】(二)-全面详解(学习总结---从入门到深化)
32 0
|
9月前
|
存储 算法 Java
JVM学习日志(十三) G1垃圾回收流程 及 垃圾回收器总结
G1垃圾回收流程 及 垃圾回收器 总结 简述
154 0
JVM学习日志(十三) G1垃圾回收流程 及 垃圾回收器总结
|
9月前
|
算法 安全 Java
JVM学习日志(十) 垃圾回收算法
垃圾回收算法 简述
46 0
JVM学习日志(十) 垃圾回收算法
|
9月前
|
Java C++
JVM学习日志(九) 对象的finalization机制
对象的finalization机制 简述
80 0
|
4月前
|
存储 缓存 Java
JVM【带着问题去学习 02】数据结构栈+本地方法栈+虚拟机栈+JVM栈运行原理
JVM【带着问题去学习 02】数据结构栈+本地方法栈+虚拟机栈+JVM栈运行原理
34 0
|
4月前
|
存储 缓存 算法
JVM【带着问题去学习 01】什么是JVM+内存结构+堆内存+堆内存参数(逃逸分析)
JVM【带着问题去学习 01】什么是JVM+内存结构+堆内存+堆内存参数(逃逸分析)
33 0
|
4月前
|
Java 编译器 开发者
旁边的同事突然晋升阿里P7,只因偷偷学习了这份JVM笔记?
大家都是有经验的Java开发人员,想想为何要学习JVM? [面试?调优?装逼? ] 不管出于何种原因,总之你得先学好。那怎么学好呢?
|
5月前
|
监控 算法 Java
学习JVM调优
学习JVM调优是为了优化Java应用程序的性能和资源利用。本文将从以下几个方面详细介绍学习JVM调优的步骤和技巧,帮助读者更好地理解和应用这些调优技术。