过程

装载

条件

主动使用 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. WebService1

    一.什么是WebService(来源百度百科) Web service是一个平台独立的,低耦合的,自包含的.基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言下的一个子集)标准来描述. ...

  2. canvas 鼠标位置缩放图形

    最近再做 webcad , 需要在 canvas  上对图形进行缩放,主要分为以下几个步骤: 1.找到当前光标所在位置,确定其在相对 canvas 坐标系的坐标 绑定鼠标滚轮事件,假定每次缩放比例 0 ...

  3. 【JVM从小白学成大佬】2.Java虚拟机运行时数据区

    目录 1.运行时数据区介绍 2.堆(Heap) 是否可能有两个对象共用一段内存的事故? 3.方法区(Method Area) 4.程序计数器(Program Counter Register) 5.虚 ...

  4. centos7 环境下安装nginx--Linux

    一.安装前需要的编译环境准备 1.安装make yum install -y gcc automake autoconf libtool make 2.安装gcc.gcc-c++ yum instal ...

  5. RDIFramework.NET敏捷开发框架通过SignalR技术整合即时通讯(IM)

    1.引言 即时通讯(IM)是RDIFramework.NET敏捷开发框架全新提供的一个基于Web的即时通讯.内部聊天沟通的工具.界面美观大方对于框架内部进行消息的沟通非常方便.基于RDIFramewo ...

  6. Code signing is required for product type 'Unit Test Bundle' in SDK 'iOS 11.0.1'

    Code signing is required for product type 'Unit Test Bundle' in SDK 'iOS 11.0.1' 进入 projects and lis ...

  7. Windows10下载mysql详解

    mysql版本分为企业版(Enterprise)和社区版(Community),其中社区办是通过GPL协议授权的开源软件,可以免费使用,而企业版是需要收费的商业软件. mysql官网 https:// ...

  8. 安装yarn集群

    安装yarn集群 # mapreduce运行平台YARN mapreduce程序应该是在很多机器上并行启动,而且先执行map task,当众多的maptask都处理完自己的数据 后,还需要启动众多的r ...

  9. 六.html基础

    web前端前几个月学过一段时间,现在在学习一遍,当作复习,最重要的看看web渗透常用的标签! <html></html>  不带任何属性 <body></bo ...

  10. Linux Centos虚拟机扩容(/dev/mapper/centos-root)

    1:.首先查看我们的根分区大小是多少 df -h 文件系统 类型 容量 已用 可用 已用% 挂载点 /dev/mapper/centos-root xfs 18G 1.1G 17G 6% / devt ...