【深入浅出-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 程序员那样,时刻关心着 ...
随机推荐
- 爬虫之爬取电影天堂(request)
#需要通过代码打开https://www.dytt8.net/网站,拿到网站内容 from urllib.request import urlopen #拿到urlopen import re con ...
- Vue中拆分视图层代码的5点建议
目录 一.框架的定位 二. Vue开发中的script拆分优化 1.组件划分 2.剥离业务逻辑代码 3. 剥离数据转换代码 4. 善用computed和filters处理数据展示 5. 使用direc ...
- MBR和EFI启动过程
MBR启动过程 BIOS-->MBR(主引导记录)-->DPT(硬盘分区表)-->DBR(分区引导扇区)-->BootMgr-->BCD-->Winload.exe ...
- mybatis 源码分析(三)Executor 详解
本文将主要介绍 Executor 的整体结构和各子类的功能,并对比效率: 一.Executor 主体结构 1. 类结构 executor 的类结构如图所示: 其各自的功能: BaseExecutor: ...
- python webdriver 常用元素操作
1.新建实例 xx_driver = os.path.abspath(r"路径") os.environ["webdriver.xx.driver"] = xx ...
- **p,*p和&p使用有感
*p两种使用情况: 1.定义指针变量,如char *p:这里p是一个变量,单单在这一点上与int a 无差别:但p这个变量特殊在其中只能存地址. 引申:对于char **p,p中存一个地址add1,a ...
- SpringBoot中使用rabbitmq,activemq消息队列和rest服务的调用
1. activemq 首先引入依赖 pom.xml文件 <dependency> <groupId>org.springframework.boot</groupId& ...
- Keras实例教程(3)
https://blog.csdn.net/baimafujinji/article/details/80705578
- caffe学习网站
1.http://www.cnblogs.com/denny402/tag/caffe/
- HTML5 storage事件监听
引用<h5移动web开发指南>上的话: “当同源页面的某个页面修改了localStorage,其余的同源页面只要注册了storage事件,就会触发” 所以,localStorage st ...