深入理解JVM-类加载及类加载器 (2)

介绍:JVM是一个令人望而却步的领域,因为它博大精深,涉及到的内容与知识点非常之多。虽然Java开发者每天都在使用JVM,但对其有所研究并且研究深入的人却少之又少。然而,JVM的重要性却又是不言而喻的。基于JVM的各种动态与静态语言生态圈已经异常繁荣了,对JVM的运行机制有一定的了解不但可以提升我们的竞争力,还可以让我们在面对问题时能够沉着应对,加速问题的解决速度;同时还能够增强我们的自信心,让我们更加游刃有余。

JVM介绍

HotSpot虚拟机讲解

垃圾收集方式详解

垃圾收集算法详解

垃圾收集器详解

分代垃圾收集机制详解

新生代讲解

老年代讲解

G1收集器分析与实例

常见且重要虚拟机参数示例

方法区

线程共享内存区

根搜索算法

Serial收集器

ParNew收集器

加载机制详解

加载的双亲委托机制

字节码文件生成与分析

魔数

常量池与方法表

各种指令详解

锁详解

线程安全

偏向锁、自旋锁与轻量级锁

JIT编译器

GC日志生成与分析

虚拟机监控工具详解

jConsole使用方式详解

何为逃逸与逃逸分析

方法内联

虚拟机内存模型详解

= = = = = = = = = = = =

以前都不知道这些工具的存在:

jConsole

Jvusualvm

jmap

image-20200207000103348

类加载

在Java代码中,类型加载、连接与初始化过程都是在程序运行期间完成的。

(类型,并不代表类产生的对象,而是类本身。类型是在程序运行期间生成出来的,run time)

提供了更大的灵活性,增加了更多的可能性

(为有创意的开发者提供了很多的功能。)

类加载器深入剖析

Java虚拟机与程序的生命周期

在如下几种情况下,Java虚拟机将结束生命周期

执行了System.exit()方法

程序正常执行结束

程序在执行过程中遇到了异常或者错误而异常终止

由于操作系统出现错误而导致Java虚拟机进行终止

类的加载、连接与初始化

加载: 查找并加载类的二进制数据

连接

-验证:确保被加载的类的正确性

-准备:为类的静态变量分配内存,并将其初始化为默认值

-解析:把类中的符号引用转换为直接引用

初始化:为类的静态变量赋予正确的初始值

使用

卸载

从代码来理解: class Test{ public static int a = 1; } //我们程序中给定的是 public static int a = 1; //但是在加载过程中的步骤如下: 1. 加载阶段 编译文件为class文件,然后通过类加载,加载到JVM 2. 连接阶段 第一步(验证):确保Class类文件没问题 第二步(准备):先初始化为 a=0。(因为你int类型的初始值为0) 第三步(解析):将引用转换为直接引用 3. 初始化阶段: 通过此解析阶段,把1赋值为变量a 4. 使用阶段 我们平时使用的对象,操作,方法调用,等等都是使用阶段 5. 卸载阶段 类在卸载之后,就不能够继续new对象,平时开发很少接触到这个卸载阶段。比如-OSGI技术会使用到卸载

图解:

image-20200208165100079

Java程序对类的使用方式可分为两种

主动使用(七种)

创建类的使用

访问某个类或者接口的静态变量,或者对该静态变量赋值

调动类的静态方法(助记符: getstatic putstatic invokestatic )

反射(如:Class.forName("com.test.Test"))

初始化一个类的子类

Java虚拟机启动时被表明为启动类的类(Java Test)

JDK1.7开始提供的动态语言支持

被动使用

除了以上七种主动使用的情况,其他使用Java类的方式都被看做是对类的被动使用,都不会导致类的初始化。

所有Java虚拟机实现必须在每个类或者接口被Java程序“首次主动使用”时才初始化他们

类的加载

类的加载指的是将类的.class文件中二进制数据读入到内存中,将其放在运行时数据区内的方法去内,然后再内存中创建一个java.lang.Class对象(规范并未说明Class对象谓语哪里,HotSpot虚拟机将其放在了方法去中)用来封装类在方法区内的数据结构

加载.class文件的方式

从本地系统中直接加载

通过网络下载.class文件

从zip,jar等归档文件中加载.class文件

从专有数据库中提取.class文件

将Java源文件动态编译为.class文件(动态代理,web开发jsp转成servlet)

/* 举例说明: 对于静态字段来说,只有直接定义了该字段的类才会被初始化; 当一个类在初始化是,要求其父类全部都已经初始化完毕了; -XX:+TraceClassLoading,用于追种类的加载信息并打印出来。 所有的参数都是: -XX:+<option> , 表示开启option选项 -XX:+<option> ,表示关闭option选项 -XX:+<option>=<value> 表示将option选项的值设置为value */ public class MyTest1 { public static void main (String[] args){ System.out.println(MyChild1.str2); } } class MyParent1{ public static String str = "hello world"; static { System.out.println("MyParent1 static block"); } } class MyChild1 extends MyParent1{ public static String str2 = "welcome"; static{ System.out.println("MyChild1 static block"); } } 输出结果: > Task :MyTest1.main() MyParent1 static block MyChild1 static block welcome

查看类的加载信息,并打印出来。

jvm 参数介绍:
-XX:+ , 表示开启option选项
-XX:+ ,表示关闭option选项
-XX:+= 表示将option选项的值设置为value

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpszsp.html