过程

装载

条件

主动使用 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 装载的更多相关文章

  1. 深入浅出 JVM GC(3)

    # 前言 在 深入浅出 JVM GC(2) 中,我们介绍了一些 GC 算法,GC 名词,同时也留下了一个问题,就是每个 GC 收集器的具体作用.有哪些 GC 收集器呢? Serial 串行收集器(只适 ...

  2. 深入浅出 JVM GC(2)

    # 前言 在 深入浅出 JVM GC(1) 中,限于上篇文章的篇幅,我们留下了一个问题 : 如何回收? 这篇文章将重点讲述这个问题. 在上篇文章中,我们也列出了一些大纲,今天我们就按照那个大纲来逐个讲 ...

  3. 阿里架构师带你深入浅出jvm

    本文跟大家聊聊JVM的内部结构,从组件中的多线程处理,JVM系统线程,局部变量数组等方面进行解析 JVM JVM = 类加载器(classloader) + 执行引擎(execution engine ...

  4. 深入浅出 JVM ClassLoader

    # 前言 在 JVM 综述里面,我们说,JVM 做了三件事情,Java 程序的内存管理, Java Class 二进制字节流的加载(ClassLoader),Java 程序的执行(执行引擎).我们也说 ...

  5. 对JVM还有什么不懂的?一文章带你深入浅出JVM!

    本文跟大家聊聊JVM的内部结构,从组件中的多线程处理,JVM系统线程,局部变量数组等方面进行解析 JVM JVM = 类加载器(classloader) + 执行引擎(execution engine ...

  6. 【深入浅出-JVM】(77):SPI

    概念 Service Provider Interface 规则 在resource/META-INF/services 创建一个以接口全限定名为命名的文件,内容写上实现类的全限定名 接口实现类在cl ...

  7. JVM的类装载子系统

    在JAVA虚拟机中,负责查找并装载类型的那部分被称为类装载子系统. JAVA虚拟机有两种类装载器:启动类装载器和用户自定义类装载器.前者是JAVA虚拟机实现的一部分,后者则是Java程序的一部分.由不 ...

  8. 深入浅出 JVM GC(4)常用 GC 参数介绍

    # 前言 从前面的3篇文章中,我们分析了5个垃圾收集器,还有一些 GC 的算法,那么,在 GC 调优中,我们肯定会先判断哪里出现的问题,然后再根据出现的问题进行调优,而调优的手段就是 JVM 提供给我 ...

  9. 深入浅出 JVM GC(1)

    # 前言 初级 Java 程序员步入中级程序员的有一个无法绕过的阶段------GC(Garbage Collection).作为 Java 程序员,说实话,很幸福,不用像 C 程序员那样,时刻关心着 ...

随机推荐

  1. 使用python画3D线条

    """用于验证整体趋势正确性""" #!python3 #-*- coding:utf-8 -*- import matplotlib as ...

  2. GD32电压不足时烧写程序导致程序运行异常的解决方法

    一直使用的GD32F450前段时间遇到这样一个问题,当使用J-Link供电给板子烧写程序之后,程序运行缓慢,就像运行在FLASH高速部分之外一样,但是如果使用外部供电烧写,就不会出现这个问题,而且一旦 ...

  3. android ——Intent

    Intent是android程序中各组件之间进行交互的重要方式,它可以用于指明当前组件想要执行的动作,也可以在不同组件之间传递数据,Intent一般被用于启动活动,启动服务以及发送广播. 一.显式的使 ...

  4. Javaweb表格加载---DataTable

    Datatables是一款jquery表格插件.它是一个高度灵活的工具,可以将任何HTML表格添加高级的交互功能. 使用 jQuery Datatable 构造数据列表,并且增加或者隐藏相应的列,已达 ...

  5. Android实现多语言so easy

    微信公众号:CodingAndroid CSDN:http://blog.csdn.net/xinpengfei521声明:本文由CodingAndroid原创,未经授权,不可随意转载! 最近,我们公 ...

  6. Flutter学习笔记(16)--Scaffold脚手架、AppBar组件、BottomNavigationBar组件

    如需转载,请注明出处:Flutter学习笔记(15)--MaterialApp应用组件及routes路由详解 今天的内容是Scaffold脚手架.AppBar组件.BottomNavigationBa ...

  7. 7.19 包 logging模块 hashlib模块 openpyxl模块 深浅拷贝

    包 包是什么 他是一系列文件的结合体,表现形式就是文件夹 包的本质还是模块 他通常会有__init__.py文件 我们首先回顾一下模块导入的过程 import module首次导入模块(.py文件) ...

  8. Java并发之内存模型(JMM)浅析

    背景 学习Java并发编程,JMM是绕不过的槛.在Java规范里面指出了JMM是一个比较开拓性的尝试,是一种试图定义一个一致的.跨平台的内存模型.JMM的最初目的,就是为了能够支多线程程序设计的,每个 ...

  9. c语言的图形库

    图形库链接http://www.easyx.cn/ 使用图形库头文件easyx.h或graphics.h 同样在里面下载图形库帮助文档进行查询 vs vc都可使用图形库 图形库窗口: initgrap ...

  10. DFS树求割点问题

    时间复杂度:O(n玄学)总之不大 代码实现(好麻烦,蓝题变紫题) #include<iostream> #include<string.h> #include<algor ...