`

jvm_4_类装载器简介

    博客分类:
  • jvm
 
阅读更多

 

1 class装载验证流程

 

a) 加载:

a.1) 装载类的第一个阶段
a.2) 取得类的二进制流
a.3) 转为方法区数据结构
a.4) 在Java堆中生成对应的java.lang.Class对象


b) 链接
验证:



 


准备:

分配内存,并为类设置初始值 (方法区中)
   public static int v=1;
    在准备阶段中,v会被设置为0
    在初始化的<clinit>中才会被设置为1
    对于static final类型,在准备阶段就会被赋上正确的值
   public static final  int v=1;

 
解析:

符号引用(字符串)替换为直接引用(指针/地址)


c) 初始化 : 执行父类构造器,执行子类构造器

 

 



2 什么是类装载器ClassLoader

 

a) ClassLoader是一个抽象类
b) ClassLoader的实例将读入Java字节码将类装载到JVM中
c) ClassLoader可以定制,满足不同的字节码流获取方式
d) ClassLoader负责类装载过程中的加载阶段

ClassLoader的几个方法:

public Class<?> loadClass(String name) throws ClassNotFoundException
载入并返回一个Class

protected final Class<?> defineClass(byte[] b, int off, int len)
定义一个类,不公开调用

protected Class<?> findClass(String name) throws ClassNotFoundException
loadClass回调该方法,自定义ClassLoader的推荐做法

protected final Class<?> findLoadedClass(String name) 
寻找已经加载的类

 

ClassLoader的分类:

a) BootStrap ClassLoader (启动ClassLoader)
b) Extension ClassLoader (扩展ClassLoader)
c) App ClassLoader (应用ClassLoader/系统ClassLoader)
d) Custom ClassLoader(自定义ClassLoader)

 

这四个分类对应关系和对应JAR:



 

上图中,查找类是从底向上查找,如果找到就不会继续向上找。

 

 

 

 

3 java沙箱简介:

 

java沙箱是你可以接受来自任何来源的代码,沙箱限制了可能进行系统破坏的任何动作,所以沙箱更像一个针对具有破坏能力代码的监狱。

 

java沙箱基本组件:

a) 类装载器 (可以由用户定制)

b) class文件校验器

c) 内置的java虚拟机

d) 安全管理器  (可以由用户定制)

e) java核心API

 

 

4 java类装载器体系结构(从三方面对java沙箱起作用):

 

a) 防止恶意代码干扰善意代码:(确保类之间相互独立)

不同类装载器装入同样类会产生一个唯一的命名空间,不同命名空间之间的类如同各自有自己的防护罩,

隔绝并感知不到彼此存在,jvm维护这些命名空间,看下图理解:

 


 


 b) 守护了被信任的类库边界(确保包的安全)

  jvm通过 双亲委托模式 和 运行时包 来界定类库的边界。

 

 b.1) 双亲委托模式:

  先看如下代码(java.lang.ClassLoader的loadClass)

<SPAN style="FONT-SIZE: 14px">protected synchronized Class<?> loadClass(String name, boolean resolve)
	throws ClassNotFoundException
    {
	// First, check if the class has already been loaded
	Class c = findLoadedClass(name);
	if (c == null) {
	    try {
		if (parent != null) {
		    c = parent.loadClass(name, false);
		} else {
		    c = findBootstrapClass0(name);
		}
	    } catch (ClassNotFoundException e) {
	        // If still not found, then invoke findClass in order
	        // to find the class.
	        c = findClass(name);
	    }
	}
	if (resolve) {
	    resolveClass(c);
	}
	return c;
    }</SPAN>

 

 

虚拟机去装载一个类时, 调用loadClass()方法,在方法内,

使用findLoadedClass来判断要装载的类字节码是否已经转入了内存,

如果没有的话,它会找到它的parent(parent是指装载自己的类加载器,而应用程序的类加载器是AppClassLoader),然后调用parent的loadClass,重复自己loadClass的过程。

如果parent没有装载过着这个类,就调用findBootstrapClass(这里是指bootStrap,启动装载器)

来尝试装载这个类的字节码,

如果bootStrap也没有办法装载这个类,则调用自己的findClass来尝试装载这个类,

如果还是没办法装载则抛出异常。

 

说白了,双亲委托模式就是:

自底向上检查类是否已经加载
自顶向下尝试加载类。

 

那么双亲委托模式的优点:

 

自定义一个String类,

public class String {

	public static void main(String[] args) {

		System.out.println("111");
	}

}


运行报错如下:
java.lang.NoSuchMethodError: main
Exception in thread "main" 

行这个我们自己定义的类的java.lang.String的双亲委托模式加载过程如下AppClassLoader -> ExtClassLoader -> BootstrapLoader, 按照上述代码加载流程, AppClassLoader 根据name去classpath下找这个类,找不到,然后在BootstrapLoader下找,BootstrapLoader去加载核心API里的类,它匹配到核心API(JAVA_HOME\jre\lib)里的String类,所以调用核心API里的String类里的main函数,所以就抛出异常了

 

总结下 优点就是: 防止了我们自己写的类对java核心代码的破坏。

 

 

 b.2) 运行时包:

jvm只允许装载同一包中的类互相访问,

自定义下的 java.lang.xxx  和  java.lang.String 是不同加载器加载,因此不能相互访问,达到隔离效果

 

 

c)  将代码归入到某保护区,确保类内代码的作用域

 

类装载器会把代码放在保护区中一限定这些代码能够执行的操作的权限,类比于在监狱指定范围活动。

 

 

 

5 类装载器体现结构脑图:

 

 

 

 

 

 

 

 

 

 

 

 

  • 大小: 15.6 KB
  • 大小: 107 KB
  • 大小: 64.8 KB
  • 大小: 26.8 KB
分享到:
评论

相关推荐

    jvm类装载器原理

    java jvm类装载器原理 介绍较为详细 大家可以参考

    深入JVM内核—原理、诊断与优化视频教程-6. 类装载器

    深入JVM内核—原理、诊断与优化视频教程-6. 类装载器 深入JVM内核—原理、诊断与优化视频教程-6. 类装载器

    java之jvm学习笔记五(实践写自己的类装载器)

    java之jvm学习笔记五(实践写自己的类装载器)

    Java深度历险(2)--深入类装载器

    类装载器是Java 平台上最神秘,也是最 有趣的一个组,通过类装载器,除了可以实现程序的动态性之外,更能够做 到 无 懈 可 击 的 安 全 性

    jvm原理与调优

    该文档是关于java虚拟机的原理,描述及调优视频,其中,详细讲述了jvm的运行机制,类装载器,GC算法,性能监控工具,堆,锁等内容。

    《JVM从入门到入魔》笔记.pdf

    1:JVM内存模型:类加载机制【转载、验证、准备、解析、初始化】+类装载器【装载器分类、加载原则】+运行时数据区【方法区、堆、虚拟机栈、本地方法栈、程序计数器】。 2:垃圾回收:垃圾确定【引用计数法、可达性分析...

    JVM加载class文件的原理机制

    JVM加载class文件的原理机制 Java中的所有类,必须被装载到jvm中才能运行,这个装载工作是由jvm中的类装载器完成的,类装载器所做的工作实质是把类文件从硬盘读取到内存中

    深入JVM内核 - 原理、诊断与优化

    类装载 class装载流程 ClassLoader模式 ClassLoader的使用实例分析 热替换例子 详细介绍ClassLoader的原理和应用。分析2个案例,说明ClassLoader的使用。 第七课 性能监控工具 线程死锁分析 OOM分析 介绍常用的JVM...

    JVM基础.doc

    学习关于JVM基础,java内模型的全面透析,Jar hell问题以及解决办法,Class文件格式 • Java编译执行流程 • ClassFile的格式介绍 • ClassFile中FieldInfo和MethodInfo介绍 • 类型描述Descriptor介绍 • ClassFile...

    Java虚拟机类装载:原理、实现与应用

    类的动态装载机制是JVM的一...本文介绍了JVM中类装载的原理、实现以及应用,尤其分析了ClassLoader的结构、用途以及如何利用自定义 的ClassLoader装载并执行Java类,希望能使读者对JVM中的类装载有一个比较深入的理解。

    面试必问之jvm与性能优化

    Java中的所有类,都需要由类加载器装载到JVM中才能运行。类加载器本身也是一个类,而它的工作就是把class文件从硬盘读取到内存中。在写程序的时候,我们几乎不需要关心类的加载,因为这些都是隐式装载的,除非我们有...

    深入JVM内核—原理、诊断与优化

    内涵jvm视频讲解:包含内容初始jvm 、jvm运行机制、常用参数配置、GC算法与种类、GC参数、类装载器、性能监控工具,和Java堆分析 ,锁、的讲解

    深入解析JVM对dll文件和对类的装载过程

    主要介绍了JVM对dll文件的装载和对类的装载过程,针对Java在Windows下的一些运行情况作出讲解,需要的朋友可以参考下

    JVM深入理解.xmind

    文件总结了JVM的体系结构:四大块,类装载子系统(class loader subsystem),执行引擎子系统(Executionengine子系统),垃圾回收系统(gc),运行时数据区(JVM内存)。

    JVM指令集(1).docx

    jvm常用的指令,是分析字节码反汇编的必备指令 常用的指令 &gt; iconst_0 将int类型常量0压入栈 &gt; istore_1 将int类型值存入局部变量1 &gt; iconst_0 将int类型常量0压入栈 &gt; istore_2 将int类型值存入局部变量2 &gt; iload_1...

    实战Java虚拟机——JVM故障诊断与性能优化 pdf

    《实战Java虚拟机——JVM故障诊断与性能优化》内容简介:随着越来越多的第三方语言(Groovy、Scala、JRuby等)在Java虚拟机上运行,Java也俨然成为一个充满活力的生态圈。本书将通过200余示例详细介绍Java虚拟机中的...

    jvm规范

    最权威的JVM规范,深入讲解classloader,class装载时机,类装载安全

    JVM中编译Class、内存回收、多线程原理和使用

    JVM负责装载class文件并执行,因此,首先是JDK如何将Java代码编译为class文件、如何装载class文件及如何执行class,将源码编译为class文件的实现取决于各个JVM实现或各种源码编译器。class文件通常由类加载器...

    实战JAVA虚拟机++JVM故障诊断与性能优化.pdf

    第4~5章介绍了垃圾回收的算法和各种垃圾回收器。第6章介绍了Java虚拟机的性能监控和故障诊断工具。第7章详细介绍了对Java堆的分析方法和案例。第8章介绍了Java虚拟机对多线程,尤其是对锁的支持。第9~10章介绍了Java...

Global site tag (gtag.js) - Google Analytics