【深入浅出-JVM】(75):class 装载
过程

装载
条件
主动使用 class时
- 创建一个类的实例 (new 、反射、克隆、反序列化)
- 调用类的静态方法(invokestatic)
- 使用类或接口的静态字段(getstatic、putstatic)
- 使用 reflect反射
- 初始化子类,先初始化父类
- main方法的类
例子
被动引用不会初始化类
package com.mousycoder.mycode.thinking_in_jvm;
/**
* @version 1.0
* @author: mousycoder
* @date: 2019-09-02 16:29
*/
public class Parent {
static {
System.out.println("Parent init");
}
public static int v = 100;
}
package com.mousycoder.mycode.thinking_in_jvm;
import sun.jvm.hotspot.memory.ParNewGeneration;
/**
* @version 1.0
* @author: mousycoder
* @date: 2019-09-02 16:29
*/
public class Child extends Parent {
static {
System.out.println("Child init");
}
}
package com.mousycoder.mycode.thinking_in_jvm;
/**
* @version 1.0
* @author: mousycoder
* @date: 2019-09-02 16:32
*/
public class UseParent {
public static void main(String[] args) {
System.out.println(Child.v);
}
}
虚拟机参数 -XX:+TraceClassLoading
输出
[Loaded com.mousycoder.mycode.thinking_in_jvm.Parent from file:/Users/mousycoder/My/code/mycode/target/classes/]
[Loaded com.mousycoder.mycode.thinking_in_jvm.Child from file:/Users/mousycoder/My/code/mycode/target/classes/]
Parent init
100
[Loaded java.lang.Shutdown from /Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home/jre/lib/rt.jar]
[Loaded java.lang.Shutdown$Lock from /Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home/jre/lib/rt.jar]
表示 Child被加载了,但是没有被初始化
final 常量不会引起类初始化
package com.mousycoder.mycode.thinking_in_jvm;
/**
* @version 1.0
* @author: mousycoder
* @date: 2019-09-02 16:41
*/
public class FinalFieldClass {
public static final String constString = "CONST";
static {
System.out.println("FinalFieldClass init");
}
}
package com.mousycoder.mycode.thinking_in_jvm;
public class UseFinalField {
public static void main(String[] args) {
System.out.println(FinalFieldClass.constString);
}
}
输出
CONST
FinalFieldClass 类没有因为常量 constString 被引用而初始化,而是直接把CONST 放在常量池中


加载
例子:加载String类
package com.mousycoder.mycode.thinking_in_jvm;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
/**
* @version 1.0
* @author: mousycoder
* @date: 2019-09-03 13:38
*/
public class StringTest {
public static void main(String[] args) throws ClassNotFoundException {
Class clzStr = Class.forName("java.lang.String");
Method[] ms = clzStr.getDeclaredMethods();
for (Method m : ms) {
String mod = Modifier.toString(m.getModifiers());
System.out.println(mod + " " + m.getName() + " ( ");
Class<?>[] ps = m.getParameterTypes();
if (ps.length == 0 ){
System.out.println(')');
}
for (int i = 0; i < ps.length; i++) {
char end =i==ps.length-1 ? ')':',';
System.out.println(ps[i].getSimpleName() + end);
}
System.out.println();
}
}
}
输出
``
public equals (
Object)
public toString (
)
public hashCode (
)
public volatile compareTo (
Object)
public compareTo (
String)
public indexOf (
String,
int)`
``
验证
保证加载的字节码合法

准备
为类分配对应的内存空间,并设置初始值,此阶段不会有 java 代码执行
| 类型 | 默认初始值 |
|---|---|
| int | 0 |
| long | 0L |
| short | (short)0 |
| char | \u0000 |
| boolean | false |
| reference | null |
| float | 0f |
| double | 0f |
解析
将类、接口、字段、方法的符号引用(字面量的引用)转成直接引用(找到方法中表的位置)
初始化
执行类的初始化方法,此方法由编译器自动生成的,由类静态成员的赋值语句以及static 语句块合并产生
其中函数是带锁线程安全的,可能会导致死锁。
【深入浅出-JVM】(75):class 装载的更多相关文章
- 深入浅出 JVM GC(3)
# 前言 在 深入浅出 JVM GC(2) 中,我们介绍了一些 GC 算法,GC 名词,同时也留下了一个问题,就是每个 GC 收集器的具体作用.有哪些 GC 收集器呢? Serial 串行收集器(只适 ...
- 深入浅出 JVM GC(2)
# 前言 在 深入浅出 JVM GC(1) 中,限于上篇文章的篇幅,我们留下了一个问题 : 如何回收? 这篇文章将重点讲述这个问题. 在上篇文章中,我们也列出了一些大纲,今天我们就按照那个大纲来逐个讲 ...
- 阿里架构师带你深入浅出jvm
本文跟大家聊聊JVM的内部结构,从组件中的多线程处理,JVM系统线程,局部变量数组等方面进行解析 JVM JVM = 类加载器(classloader) + 执行引擎(execution engine ...
- 深入浅出 JVM ClassLoader
# 前言 在 JVM 综述里面,我们说,JVM 做了三件事情,Java 程序的内存管理, Java Class 二进制字节流的加载(ClassLoader),Java 程序的执行(执行引擎).我们也说 ...
- 对JVM还有什么不懂的?一文章带你深入浅出JVM!
本文跟大家聊聊JVM的内部结构,从组件中的多线程处理,JVM系统线程,局部变量数组等方面进行解析 JVM JVM = 类加载器(classloader) + 执行引擎(execution engine ...
- 【深入浅出-JVM】(77):SPI
概念 Service Provider Interface 规则 在resource/META-INF/services 创建一个以接口全限定名为命名的文件,内容写上实现类的全限定名 接口实现类在cl ...
- JVM的类装载子系统
在JAVA虚拟机中,负责查找并装载类型的那部分被称为类装载子系统. JAVA虚拟机有两种类装载器:启动类装载器和用户自定义类装载器.前者是JAVA虚拟机实现的一部分,后者则是Java程序的一部分.由不 ...
- 深入浅出 JVM GC(4)常用 GC 参数介绍
# 前言 从前面的3篇文章中,我们分析了5个垃圾收集器,还有一些 GC 的算法,那么,在 GC 调优中,我们肯定会先判断哪里出现的问题,然后再根据出现的问题进行调优,而调优的手段就是 JVM 提供给我 ...
- 深入浅出 JVM GC(1)
# 前言 初级 Java 程序员步入中级程序员的有一个无法绕过的阶段------GC(Garbage Collection).作为 Java 程序员,说实话,很幸福,不用像 C 程序员那样,时刻关心着 ...
随机推荐
- todaytt
<?xml version="1.0" encoding="utf-8"?> <android.support.v4.widget.Drawe ...
- echarts3.x遇到的坑
此文章用来记录echarts3.x遇到的坑,方便以后自己不再犯. 1.柱形图设置了yAxis.splitArea.show=true,后面设置的splitLine就会变不可见了.也没在官方文档中找到说 ...
- 工作中常见的五种技术leader
力不从心型 在工作中有种技术leader,总认为自己是最好的.在方案设计的时候,自己有一种方案,下属有一种方案.leader非要别人听他的.如果两种方案没有优劣之分,比较建议的做法是让真正实施的人按照 ...
- poj 1286 polya定理
Necklace of Beads Description Beads of red, blue or green colors are connected together into a circu ...
- 前端项目优化 -Web 开发常用优化方案、Vue & React 项目优化
github github-myBlob 从输入URL到页面加载完成的整个过程 首先做 DNS 查询,如果这一步做了智能 DNS 解析的话,会提供访问速度最快的 IP 地址回来 接下来是 TCP 握手 ...
- Flutter学习笔记(18)--Drawer抽屉组件
如需转载,请注明出处:Flutter学习笔记(18)--Drawer抽屉组件 Drawer(抽屉组件)可以实现类似抽屉拉出和推入的效果,可以从侧边栏拉出导航面板.通常Drawer是和ListView组 ...
- python学习之并发编程(理论部分)
第一章 操作系统 管理控制协调计算机中硬件与软件的关系. 操作系统的作用? 第一个作用: 将一些对硬件操作的复杂丑陋的接口,变成简单美丽的接口. open函数. 第二个作用: 多个进程抢占一个(CPU ...
- React 多副本问题
Element ref was specified as a string (MySider) but no owner was set. This could happen for one of t ...
- shell习题2
1---------------->>>>输入一个设备文件,输出这个设备文件的基本信息: 2.------------->>>>显示一个如下的菜单,cp ...
- android下JNI开发
android下JNI开发 what 什么是JNI JNI java native interface native本地 java本地接口 通过JNI可以实现java和本地代码之间相互调用 jni可以 ...