虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个周期包括:加载(Loading).验证(Verification).准备(Preparation).解析(Resolution).初始化(Initialization).使用(Using).卸载(Unloading)七个阶段.其中验证.准备.解析三个部分统称为链接(Linking),这七…
(自学笔记,持续更新,欢迎指正) 我们都知道一个java程序运行要经过编译和执行,但是这太概括了,中间还有很多步骤,今天来说说类加载 学完类加载之后,java运行过程就可以分为  编译  > 类加载  >  执行 类加载主要是由jvm虚拟机负责的,过程非常复杂,类加载分三步  加载   >  连接  >初始化,(这里的加载和本文标题的类加载是不同的,标题的类加载包含了完整的三个步骤)下面详细说说每一步的过程 1.加载:这个很简单,程序运行之前jvm会把编译完成的.class二进制文…
在Java代码中,类型的加载.连接与初始化过程都是在程序运行期间完成的:提供了更大的灵活性,增加了更多的可能性 JVM启动过程包括:加载.连接.初始化 加载:就是将class文件加载到内存.详细的说是,将class文件加载到运行时数据区的方法区内(JDK7是方法区,JDK8对应的是Metaspace),然后创建一个java.lang.Class对象,用来封装类在方法区类的数据结构.JVM规范并未说明Class对象位于何处,Hotspot虚拟机将其放在了方法区.JVM规范允许类加载器在预料某个类将…
类加载器子系统 类加载器的作用是加载class文件到内存 加载阶段->链接阶段->初始化阶段 ClassLoader只负责class文件的加载,至于是否能够运行由执行引擎判断 加载的类信息存放在方法区的一个区域,该区域称为常量池,还存放了字符串字面量.数字常量等 类加载过程 判断类是否加载,已经加载了就开始链接 加载阶段 过程 ​(1)通过全限类名找到类.class文件,获取文件的字节流 ​(2)将字节流按照静态类的数据格式转换成存储在方法区的运行时数据结构 ​(3)为该类生成唯一的java.…
Java虚拟机JVM学习06 自定义类加载器 父委托机制和命名空间的再讨论 创建用户自定义的类加载器 要创建用户自定义的类加载器,只需要扩展java.lang.ClassLoader类,然后覆盖它的findClass(String name)方法即可,该方法根据参数指定的类的名字,返回对应的Class对象的引用. 自定义类加载器的例子 代码: package com.mengdd.classloader; import java.io.ByteArrayOutputStream; import…
1.遇到new,getstatic,putstatic,invokestatic这4条字节码指令时,类如果没初始化就会被初始化,创建对象,读取或设置静态字段,调用静态方法. 2.反射 3.子类初始化前会先初始化父类 4.包含main方法的类,虚拟机启动时会先初始化该类  5.使用jdk的动态语言支持时(不明) 这五种场景被称为主动引用.   被动引用: class SuperClass{ static{ syso("super init"); } public static int v…
目录 前言 类的生命周期 类加载过程 加载 连接 验证 准备 解析 初始化 类加载器 三大类加载器 双亲委派模型 概念 为什么要使用双亲委派模型 源码分析 反双亲委派模型 参考 前言 类装载器子系统是JVM中非常重要的部分,是学习JVM绕不开的一关. 一般来说,Java 类的虚拟机使用 Java 方式如下: Java 源程序(.java 文件)在经过 Java 编译器编译之后就被转换成 Java 字节代码(.class 文件). 类加载器负责读取 Java 字节代码,并转换成 java.lang…
加载 在加载阶段, 虚拟机需要完成以下3件事情:1) 通过一个类的全限定名来获取定义此类的二进制字节流.2) 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构.3) 在内存中生成一个代表这个类的java.lang.Class对象, 作为方法区这个类的各种数据的访问入口.虚拟机规范的这3点要求其实并不算具体, 因此虚拟机实现与具体应用的灵活度都是相当大的. 例如“通过一个类的全限定名来获取定义此类的二进制字节流”这条, 它没有指明二进制字节流要从一个Class文件中获取, 准确地说是根…
一.概述 虚拟机类加载机制:虚拟机把描述类的数据从Class文件中加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型. 与那些在编译时需要进行连接工作的语言不同,在Java语言里面,类型的加载.连接和初始化过程都是在程序运行期间完成的,这种策略虽然会令类型加载时稍微增加一些性能开销,但是会为Java应用程序提供高度的灵活性,Java里天生可以动态扩展的语言特性就是依赖运行期间动态加载和动态连接这个特点实现的. 二.类加载的时机 类从被加载到虚拟机内存中开始…
概述: 上一篇文章,介绍了java虚拟机的运行时区域,Java虚拟机根据不同的分工,把内存划分为各个不同的区域.在java程序中,最小的运行单元一般都是创建一个对象,然后调用对象的某个 方法.通过上一篇文章我们知道调用某个方法是通过虚拟机栈的栈帧并通过执行引擎来实现的,但是实际上一个方法的执行前提是,该对象对应的Class文件需要加载到内存的方法区,并且 要new一个对象,对象的引用存放在虚拟机栈的本地变量表,对象的实例存放在堆.本篇文章关注的重点就是Java虚拟机如何将Class文件加载到内存…