深入理解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