JVM学习笔记
该笔记未经过整理
无衣ccc
哥哥姐姐们,能动动你们发财的小手指帮我的笔记点个赞吗!
展开
-
DriverManager类如何利用线程上下文类加载器加载java.sql.Driver实现类
1. 测试环境搭建:1. 在pom文件中导入mysql-connector-java依赖<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope></dependency>2. 搭建测试类2. DriverManager初始化流程分析2.1原创 2020-11-23 23:39:00 · 480 阅读 · 0 评论 -
25.类加载器实战剖析与疑难点解析
1. 获取各个类加载器的加载文件的路径package com.wuyiccc.jvm.classloader;/** * @author wuyiccc * @date 2020/3/11 21:39 * 岂曰无衣,与子同袍~ */public class MyTest18 { public static void main(String[] args) { System.out.println(System.getProperty("sun.boot.class原创 2020-07-16 10:08:42 · 198 阅读 · 0 评论 -
24.类加载器命名空间实战剖析与透彻理解
1. new一个对象的类加载器new MyCat() 会从当前Sample类的类加载器开始向上搜索,然后向下尝试加载package com.wuyiccc.jvm.classloader;/** * @author wuyiccc * @date 2020/3/11 19:06 * 岂曰无衣,与子同袍~ */public class MyTest17_1 { public static void main(String[] args) throws ClassNotFou原创 2020-07-16 10:01:55 · 229 阅读 · 0 评论 -
23.jvisualvm 的使用
双击进入原创 2020-07-16 10:00:41 · 145 阅读 · 0 评论 -
22.类的卸载
当MySample类被加载,连接和初始化后,它的生命周期就开始了。当代表MySample类的Class对象不再被引用,即不可触及时,Class对象就会结束生命周期,MySample类在方法区内的数据也会被卸载,从而结束MySample类的生命周期一个类何时结束生命周期,取决于代表它的Class对象何时结束生命周期由Java虚拟机自带的类加载器所加载的类,在虚拟机的生命周期中,始终不会被卸载。前面已经介绍过,Java虚拟机自带的类加载器包括根类加载器,扩展类加载器和系统类加载器。Java虚拟机本身会始终.原创 2020-07-16 09:59:09 · 222 阅读 · 0 评论 -
21.类加载器双亲委托机制实例剖析---命名空间
每个类加载器都有自己的命名空间,命名空间由该加载器及所有父加载器所加载的类组成在同一个命名空间中,不会出现类的完整名字(包括类的包名)相同的两个类在不同的命名空间中,有可能会出现类的完整名字(包括类的包名)相同的两个类所以我们可以得到如下结论子加载器所加载的类能够访问到父加载器所加载的类父加载器所加载的类无法访问到子加载器所加载的类...原创 2020-07-16 09:58:08 · 166 阅读 · 0 评论 -
20.类加载器双亲委托机制实例剖析
没有指定类加载的具体绝对路径时,如果只是包名路径,那么默认会从当前项目进行加载1. 为什么loadClass 的参数是二进制包名,而不能是 / 的 路径名呢 ?在defineClass 这个方法中规定传入的name必须是二进制包名,否则在内部的执行逻辑的checkName() 的name.indexOf("/")的方法检查中就会抛出异常但是如果传入的是二进制包名,那么在我们自定义的findClass()方法中,在具体的加载类的.class 文件的时候,就必须手动将包名转换为绝对路径.原创 2020-07-16 09:57:22 · 110 阅读 · 0 评论 -
19.类加载器重要方法详解
1. defineClass原创 2020-07-16 09:54:56 · 124 阅读 · 0 评论 -
18.自定义类加载器
package com.wuyiccc.jvm.classloader;import java.io.*;/** * @author wuyiccc * @date 2020/3/10 21:32 * 岂曰无衣,与子同袍~ */public class MyTest16 extends ClassLoader { private String classLoaderName; private final String fileExtension = ".class.原创 2020-07-16 09:52:37 · 94 阅读 · 0 评论 -
17.ClassLoader源码分析与实例剖析
1. 查看classloader 文档原创 2020-07-16 09:50:08 · 130 阅读 · 0 评论 -
16.不同类加载器作用与加载动作分析---(获取ClassLoader的途径)
1. 打印类加载器2. 通过应用类加载器来获取指定当前项目的文件的全路径因为应用类加载器可以加载当前应用的类,所以我们可以通过它的getResource方法来获取这个类的全路径package com.wuyiccc.jvm.classloader;import java.io.IOException;import java.net.URL;import java.util.Enumeration;/** * @author wuyiccc * @date 2020/3/10原创 2020-07-16 09:48:47 · 150 阅读 · 0 评论 -
15. 反射与类加载器获取类分析
调用ClassLoader类的loadClass 方法并不是对类的主动使用,不会导致类的初始化原创 2020-07-16 09:47:13 · 124 阅读 · 0 评论 -
14.类加载器双亲委托机制详解
1. 类加载器的父亲委托机制(双亲委托机制)在父亲委托机制中,各个加载器按照父子关系形成了树形结构,除了根类加载器之外(根类加载器没有父加载器),其余的类加载器都有且只有一个父加载器当一个加载器加载一个类时,会递归的交给父加载器进行加载。直到递归到最顶层,然后自顶向下进行判断,如果一旦有一个加载器能够成功加载,那么加载成功结束它是自底向上检查类是否以及加载,然后自顶向下尝试加载该类2. 各个类加载器的加载的类1. BootStrap ClassLoader (启动类加载器)Load J原创 2020-07-16 09:41:13 · 141 阅读 · 0 评论 -
13. 初始化对于类与接口的异同点深入解析
ps: 常量池的规则对于接口与类同样适用1. 一个类实现一个接口: 主动使用该类代码如下,当一个类实现一个接口时,我们主动调用该类的非编译期才能确定的常量,那么肯定会初始化该类,但是我们需要注意的是这个类实现的接口只会被加载,并不会被初始化,而如果该类是继承一个类,那么这个父类与接口不同,父类也会被初始化public class MyTest5 { public static void main(String[] args) { System.out.println(M.原创 2020-07-16 09:39:50 · 137 阅读 · 0 评论 -
12.类加载器深入解析及重要特性分析---04-类的初始化
在初始化阶段,Java虚拟机执行类的初始化语句,为类的静态变量赋予初始值,在程序中,静态变量的初始化有两种途径在静态变量的声明处进行初始化在静态代码块中进行初始化,例如在以下代码中,静态变量a和b都被显式初始化,而静态变量c没有被显式初始化,它将保持默认值public class Sample { private static int a = 0; public static long b; public static long c; static { .原创 2020-07-16 09:37:55 · 92 阅读 · 0 评论 -
11.类加载器深入解析及重要特性分析---03-类的连接
类被加载后,就进入连接阶段。连接就是将已经读入到内存的类的二进制数据合并到虚拟机的运行时环境中去1. 类的验证的内容类文件的结构检查语义检查字节码验证二进制兼容性的验证等等…2. 类的准备在准备阶段,Java虚拟机为类的静态变量分配内存,并设置默认的初始值。例如对于以下Sample类,在准备阶段,将为int类型的静态变量a分配4个字节的内存空间,并且赋予默认值为0,为long类型的静态变量b分配8个字节的内存空间,并且赋予默认值0public class Sample { .原创 2020-07-16 09:36:55 · 90 阅读 · 0 评论 -
09.类加载器深入解析及重要特性分析---02-类的加载
1. 类的加载类的加载的最终产品是位于内存中的class对象Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口2. 两种类加载器1.Java虚拟机自带的类加载器根类加载器 (Bootstrap) — 也叫启动类加载器扩展类加载器 (Extension)系统 (应用) 类加载器 (System) — 这里系统与应用是同一个概念 AppClassLoader2. 用户自定义的类加载器必须是java.lang.ClassLoader原创 2020-07-16 09:34:56 · 146 阅读 · 0 评论 -
08.类加载器深入解析及重要特性分析---01---五大阶段
1. 加载加载:就是把二进制形式的.class文件读入java虚拟机中2. 连接1. 验证类文件的结构检查语义检查 (abstract 不能与 final 共存)字节码验证 (.class 文件内部数据是否正确)二进制兼容性的验证 (新版本jvm 与 旧版本的jvm 的兼容性)2. 准备为类变量分配内存,设置默认值。但是在到达初始化之前,类变量都没有初始化为真正的初始值3. 解析解析过程就是在类型的常量池中寻找类,接口,字段和方法的符号引用,把这些符号引用替换成原创 2020-07-16 09:34:03 · 91 阅读 · 0 评论 -
07. 类的初始化顺序---准备阶段的意义
因为有了准备阶段的赋默认值,才能在没有被初始化的情况下进行运算原创 2020-07-16 09:28:47 · 91 阅读 · 0 评论 -
05-03.数组创建本质分析
不会导致类的初始化1. 引用的一维数组类型2. 引用的二维数组类型3. 总结对于数组类型来说,其类型是由JVM 在运行期间动态生成的,表示为[Lcom.wuyiccc.jvm.classloader.MyParent4,这种形式,动态生成的类型,其父类型就是Object对于数组来说,JavaDoc 经常将构成数组的元素为Component,实际上就是将数组降低一个维度后的类型4. 普通数组类型5. 补充助记符:anewarray : 表示创建一个引用类型的(如.原创 2020-07-16 09:27:38 · 94 阅读 · 0 评论 -
05-02. 运行期常量的确定时间及特性
1. 运行期常量的初始化情况当一个常量并非编译器可以确定的,那么其值就不会被放到调用类的常量池中,这时,在程序运行时,会导致主动使用这个常量所在的类,显然会导致这个类被初始化...原创 2020-07-16 09:22:03 · 99 阅读 · 0 评论 -
05-01.补充:助记符
助记符:ldc 表示将int,float或是String类型的常量值从常量池中推送至栈顶(代表马上要用)bipush 表示将单字节(-128~127) 的常量值推送至栈顶sipush 表示将一个短整型常量值(-32768~32767)推送至栈顶iconst_1 表示将int型的1 推送至栈顶iconst_2 表示将int型的2 推送至栈顶iconst_5 表示将int型的5 推送至栈顶int 值>=6 时,就是bipush包位置pac.原创 2020-07-16 09:18:05 · 393 阅读 · 0 评论 -
05-00.常量的本质含义---编译期能被确定的常量
1.案例–1可以看出加final之后的结果不一样final表示是一个常量,在编译阶段,这个常量就会被存入到调用这个常量的方法所在的类的常量池中所以加了final之后,我们可以看出是MyTest2 的main方法调用了这个常量,所以str这个常量就存入到MyTest2的常量池中本质上,调用类并没有直接引用到定义的常量,因此并不会触发定义常量的类的初始化。所以,MyParent2也就不会被初始化了注意: 这里指的是将常量存放到了MyTest2的常量池中,之后MyTest2与MyP原创 2020-07-16 09:12:30 · 206 阅读 · 0 评论 -
04-01.补充:追踪类的加载器信息
0.jvm参数的格式-XX:+ :表示开启option选项-XX:- :表示关闭option选项-XX:= :表示将option选项的值设置为value对于jvm,有一部分选项默认是开启的,有一部分是关闭的,所以有些选项就需要手动开启或者关闭1.查看类加载器的信息使用jvm参数 -XX:+TraceClassLoading...原创 2020-07-16 09:09:34 · 143 阅读 · 0 评论 -
04-00.类的加载
1.简介类的加载指的是将类的.class 文件中的二进制数据读入到内存中,然后在内存中创建一个java.lang.Class对象(规范并未说明Class对象位于哪里,HotSpot虚拟机将其放在了方法区中)用来封装类在方法区内的数据结构2.加载.class文件的方式从本地系统中直接加载通过网络下载.class文件从zip,jar等归档文件中加载.class文件从专有数据库中提取.class文件将Java源文件动态编译为.class文件3.案例分析 – 1对于上述的用子类访问原创 2020-07-16 09:08:33 · 118 阅读 · 0 评论 -
03.java对类的使用方式
1.java程序对类的使用方式可以分为两种主动使用被动使用2.所有的java虚拟机实现必须在每个类或接口被java程序"首次主动使用"时才初始化它们即首次主动使用初始化3.主动使用的七种方式创建类的实例访问某个类或接口的静态变量,或者对该静态变量赋值调用类的静态方法反射(如Class.forName(“com.test.Test”)对类的主动使用)初始化一个类的子类(初始化子类,也是对父类的主动使用)java虚拟机启动时被标明为启动类的类(main方法)jdk1.7开原创 2020-07-16 09:00:41 · 159 阅读 · 0 评论 -
02.类五大阶段:加载,连接与初始化,使用,卸载
1.加载查找并加载类的二进制数据(class文件)2.连接验证:确保被加载类的正确性准备:为类的静态变量分配内存,并将其初始化为默认值,执行static代码块解析:把类中符号引用转化为直接引用3.初始化为类的静态变量赋予正确的初始值(不是默认值)4.使用使用类或者创建对象5.卸载将类从内存中销毁,从此不能再使用该类并且创建对象ps: 对于类,先顺序执行赋默认值和static代码块,最后执行初始值赋予,对于对象成员,先执行赋默认值和初始化,然后执行代码块,最后执行构造原创 2020-07-16 08:59:41 · 163 阅读 · 0 评论 -
01.类加载器简介
1.在java代码中,类型的加载(class,interface,enum等,而不是具体的对象),连接与初始化过程都是在程序运行期间完成的1.类的加载一般都是从硬盘加载到内存中2.连接就是将类与类之间的关系处理好3.初始化一般都是对一些静态变量的赋值2.提供了更大的灵活性,增加了更多的可能性3.java虚拟机本身就是一个进程在如下几种情况下,java虚拟机将结束生命周期:1.执行了system.exit()方法2.程序正常执行结束3.程序在执行过程中遇到了异常或错误而异常终止(没有进行异原创 2020-07-16 08:58:51 · 92 阅读 · 0 评论