JVM 类加载器 (二)
1、类加载器(ClassLoader)负责加载class文件,class文件在文件开头有特定的文件标识,并且ClassLoader只负责 class 文件的加载,至于class文件是否能够运行则由Execution Engine决定;

2、类的加载过程
加载class文件 ---> 连接(验证、准备、解析class文件)----> 初始化类的对象 ----> 使用类的对象 -----> 卸载。
(1)加载class文件
取类的二进制字节流,通过类的全量命名,将静态存储结构房到方法区中,Class(类的定义或结构,即类对象)放到堆中;
(2)初始化类对象
执行类的构造器<clinit>,为类的静态变量赋予正确的初值;
构造器包含:static变量、static块;根据代码中的顺序来决定先执行哪个;
先执行构造器(static变量、static块),再执行构造方法;
3、JDK中的类加载器:
<1> 启动类加载器(BootStrap ClassLoader): C++编写的,虚拟机自带的加载器;加载$JAVA_HOME/jre/lib/rt.jar
<2> 扩展类加载器(Extension ClassLoader):java编写;加载$JAVA_HOME/jre/lib/ext/*.jar
<3> 应用程序类加载器(App ClassLoader):java编写;也叫系统类加载器,加载当前应用的 $classpath 下所有类;
<4> 用户自定义加载器:Java.Lang.ClassLoader 的子类,用户可以定制类的加载方式;

3、类加载器说明
第一步:将 MyHello 类打包成 jar包,然后放入$JAVA_HOME/jre/lib/ext/ 目录下。 MyHello内容如下:
public class MyHello
{
public static void main(String[] args)
{ }
}
第二步:编写如下代码
public class Demo1
{
public static void main(String[] args) throws ClassNotFoundException {
//启动类加载器(BootStrap ClassLoader)
Object object = new Object();
System.out.println("Object-classLoader: " + object.getClass().getClassLoader());
//结果: Object-classLoader: null //扩展类加载器 (Extension ClassLoader)
Class myHello = Class.forName("com.yufeng.jvm.hello.MyHello");
System.out.println("MyHello-classLoader: " + myHello.getClassLoader());
//结果:MyHello-classLoader: sun.misc.Launcher$ExtClassLoader@7ea987ac //应用类加载器 (App ClassLoader)
Demo1 classLoaderDemo1 = new Demo1();
System.out.println("Demo1-classLoader: " + classLoaderDemo1.getClass().getClassLoader());
//①结果:Demo1-classLoader: sun.misc.Launcher$AppClassLoader@18b4aac2 System.out.println("Demo1-classLoader-parent: " + classLoaderDemo1.getClass().getClassLoader().getParent());
//②结果:Demo1-classLoader-parent: sun.misc.Launcher$ExtClassLoader@2503dbd3 System.out.println("Demo1-classLoader-parent-parent: " + classLoaderDemo1.getClass().getClassLoader().getParent().getParent());
//③结果:Demo1-classLoader-parent-parent: null
}
}
从以上的①、②、③可以看出,启动类加载器是扩展类加载器的父类,扩展类加载器是应用加载器的父类。
打印出的Object的类加载器为null,表示它是根加载器,即启动类加载器。
4、类加载器的双亲委派机制
某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给父类加载器,依次递归,若父类加载器可以完成类加载任务,就成功返回;只有父类加载器无法完成此加载任务时,才自己去加载。
这样设计为了保证java的一种安全特性--------沙箱机制(防止恶意代码对java的破坏);
例:若自己新建了一个String类(classpath路径下),则类加载器是应用程序类加载器;加载的时候程序类加载器委托父类加载器加载(即扩展类加载器),扩展类加载器去委托启动类加载器去加载,rt.jar中有String.class文件,则会加载这个Class,不会加载自己新建的那个String类。
JVM 类加载器 (二)的更多相关文章
- 深入JVM类加载器机制,值得你收藏
先来一道题,试试水平 public static void main(String[] args) { ClassLoader c1 = ClassloaderStudy.class.getClass ...
- JVM类加载器的分类
类加载器的分类 JVM支持两种类型的类加载器,分别为引导类加载器(Bootstrap ClassLoader)和自定义类加载器(User-Defined ClassLoader). 从概念上来讲,自定 ...
- (二十七)JVM类加载器机制与类加载过程
一.Java虚拟机启动.加载类过程分析 下面我将定义一个非常简单的java程序并运行它,来逐步分析java虚拟机启动的过程. package org.luanlouis.jvm.load; impor ...
- JVM类加载器工作流程
类加载器 classloader:谈到类加载,不得不提的就是负责此项工作的类加载器classloader,classloader的职责是将Java源文件编译后的字节码文件加载到内存中去执行. 类加载至 ...
- JVM 类加载器命名空间深度解析与实例分析
一.创建Sample 1.创建实例 public class MyPerson { private MyPerson myPerson; public void setMyPerson(Object ...
- JVM 类加载器ClassLoader源码学习笔记
类加载 在Java代码中,类型的加载.连接与初始化过程都是在程序运行期间完成的. 类型可以是Class,Interface, 枚举等. Java虚拟机与程序的生命周期 在如下几种情况下,Java虚拟机 ...
- 深入理解Java类加载器(二):线程上下文类加载器
摘要: 博文<深入理解Java类加载器(一):Java类加载原理解析>提到的类加载器的双亲委派模型并不是一个强制性的约束模型,而是Java设计者推荐给开发者的类加载器的实现方式.在Java ...
- 【java虚拟机系列】JVM类加载器与ClassNotFoundException和NoClassDefFoundError
在我们日常的项目开发中,会经常碰到ClassNotFoundException和NoClassDefFoundError这两种异常,对于经验足够的工程师而言,可能很轻松的就可以解决,但是却不一定明白为 ...
- jvm类加载器以及双亲委派
首先来了解几个概念: 类加载: 概念:虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验--转换解析--初始化,最终形成能被java虚拟机直接使用的java类型,就是jvm的类加载机制. ...
随机推荐
- C# 基础 new 、override实现多台区别
一.new只是隐藏父类中的同名方法.基类和父类中都存在这个方法. namespace ConsoleApplication1 { class Program { static void Main(st ...
- 初始C语言中的数组(男神翁凯老师MOOC)
定义数组 ●<类型>变量名称[元素数量]; ● int grades[100]; ●double weight[20]; ●元素数量必须是整数 ●C99之前:元素数量必须是编译时刻确定的字 ...
- 从后台获取的数据渲染到页面中的dom操作
很多情况下页面dom都是从后台拼接字符串添加生成的新的dom元素,在编辑器中不能看到,只能通过检查看到页面的dom结构,但是这时候会发生一个问题,就是如果使用jQuery无法进行dom操作,事件和方法 ...
- ARM9/ARM11/Cortex A8处理器(转载) .
//toppic:推荐几个值得中小企业使用的ARM9/ARM11/Cortex A8处理器 // 作者:gooogleman //原文地址:http://blog.csdn.net/goooglema ...
- Ubuntu下Git从搭建到使用详解
Ubuntu下Git从搭建到使用详解 一.git的搭建 (1).sudo apt-get update (2).sudo apt-get -y install git 符:安装最新版本方法: add- ...
- 1.3.5、CDH 搭建Hadoop在安装之前(端口---Cloudera Search使用的端口)
Cloudera Search使用的端口 在下表中,每个端口的“ 访问要求”列通常是“内部”或“外部”.在此上下文中,“内部”表示端口仅用于组件之间的通信; “外部”表示该端口可用于内部或外部通信. ...
- 【OpenGL】第一个窗口
包含头文件: #include <GL/glew.h> // GLFW #include <GLFW/glfw3.h> 初始化与配置GLFW: glfwInit(); //初始 ...
- 对象转化为json
google开发的Gson转换利器,String json = new Gson ().toJson(object); 一行代搞定. 别忘了引入jar包 转自:https://zhidao.baidu ...
- html中相对(relative),绝对(absolute)位置以及float的学习和使用案例 (转)
这几天着手于CSS的研究,研究的原因主要是工作需要,最近发现如果做前端仅仅会javascript很难尽善尽美,当然懂样式和html在一定程度上可以让我们更近一步. css较为简单,由于个人擅长编写代码 ...
- Cisco N3K VPC+HSRP+ospf 配置
VPC概念 VPC:vpc是指vpc对等体设备和下游设备之间的组合PortChannel. vpc对等交换:就是组成vpc功能的两个nexus系列交换机,一个设备为主,一个为备. vpc对等连接:用于 ...