本文中主要介绍类加载器的工作机制

一:首先什么是类加载器?

  类加载器就是用来加载java类到java虚拟机中。java源程序经过编译之后形成字节码文件,类加载器将字节码文件加载到内存中,并转换成java.lang.Class的一个实例对象。

  JVM是基于栈操作的:所有的操作都要经过进栈和出栈操作。基于栈操作的优点:将运行时的优化工作和执行编译时优化的执行引擎相结合,从而起到优化Java字节码的目的。

二: 类加载器的作用:

  1. 将编译后的class字节码文件加载到JVM中。会在加载的过程进行审查每个类有哪个类加载器加载?加载哪个类?  实际上是存在一种父级优先的等级结构
  2. 将字节码文件重新解析成JVM统一要求的对象格式。

三:类加载器的分类

  •   BootStrap ClassLoader:加载的过程是由JVM自身决定的,具体如何加载,加载哪个类都是有JVM自身控制的,实际上他并不符合JVM规范,不存在等级结构,没有父加载  器,也没有子加载器。他仅仅是作为一个加载工具存在
  • ExtClassLoader:虽然他本身是JVM的一部分,但是加载并不是有JVM自身加载,他服务的特定目标是在System.getProperties("java.ext.dirs")目录下
  • APPClassLoader :是ExtClassLoader类加载器的子类,主要加载位于classpath目录下的类 System.getProperties("java.class.path")

四:JVM加载字节码文件的两种方式

  1. 隐式加载:不调用类加载器,将需要的类自动加载到内存中 例如:当前类需要外部类的引用时,就会触发隐式加载
  2. 显式加载:调用 this.getClass(),this.getClassLoader(),Class.forName(class)等方式完成的加载就是显式加载

两种加载方式可以混合使用,显式加载自定义的类,如果该类中有其他类的引用,就会触发隐式加载。

五:类加载常见的错误分析

  • ClassNotFoundException:显式加载字节码文件时,找不到对应的字节码文件异常,发生这种问题的原因是在对应的classpath下可能没有对应的字节码文件,导致异常的发生;解决方案:到对应的classpath下面检查是否有对应的字节码文件,通过this.getClass().getClassLoader().getResources().toString();获得path的路径
  • NotClassDefFoundError:类不存在异常 产生的原因是:new关键字,引用类,继承接口或者类,方法参数用有引用,这些都会导致此种异常的发生。在隐式加载这些类时可能出现类不存在的异常。
  • ClassCastException:强制类型转换时出现这个错误   

  在JVM进行类型转换时会进行自动检查

  1.   普通对象:必须是目标类的实例对象或者子类对象;如果是接口,对象是该接口的子类对象
  2. 数组对象:目标类必须是数组类型或者java.lang包下的Object ,Clonable,java.io包下的Serializable

  解决类型转换异常的方法:显式指明对象类型;通过instanceof判断是否是目标对象类型,然后在进行类型转换。

六:JVM的体系结构以及工作方式

  • JVM是通过模拟真实计算机,从而达到一个真实计算机所具有的计算功能的体系结构。以计算机为中心的真实计算机的体系结构

    •   指令集:计算机能够识别的机器语言的所有命令集合
    • 计算单元:能够识别并且控制指令执行的功能模块
    • 寄存器:中央处理器的核心组件,用来暂存,指令,地址和数据
    • 存储单元:能够存储计算机操作数和操作结构的单元,例如:内存和磁盘
    • 寻址方式:地址的范围,最小地址和最大地址范围以及地址的运行规则

                  

  •   JVM的体系结构:

    •    执行引擎:相当于CPU,控制指令执行。解析字节码文件,得到解析结果。
    • pc寄存器:每个线程启动的时候都会创建一个pc寄存器。寄存器中保存的是当前执行的JVM指令的地址。保存下一条将要执行的指令地址的寄存器是:pc寄存器。他总是保存着下一条将要执行的指令地址。地址可以是一个本地指针,也可以是方法中相对于方法起始指令的地址。
    • 本地方法栈:保存native方法的区域
    • 堆:保存的是创建的对象实例。所有的类对象都是通过new创建,创建对象后会在栈中创建该对象的引用。
    • 方法区:又叫做静态区:保存的是方法数据,类,静态变量,静态方法,常量和成员方法
    • 运行时常量池:存放的是类和接口的常量,除此之外,还有成员方法和成员变量的引用。JVM运行时就是通过这些引用来找到实际的地址

 

ClassLoader的工作机制的更多相关文章

  1. java虚拟机学习-慢慢琢磨JVM(2-1)ClassLoader的工作机制

    ClassLoader的工作机制 java应用环境中不同的class分别由不同的ClassLoader负责加载. 一个jvm中默认的classloader有Bootstrap ClassLoader. ...

  2. 深入理解ClassLoader工作机制(jdk1.8)

    ClassLoader 顾名思义就是类加载器,ClassLoader 作用: 负责将 Class 加载到 JVM 中    审查每个类由谁加载(父优先的等级加载机制)    将 Class 字节码重新 ...

  3. 理解ClassLoader工作机制

    package com.ioc; public class Test { public static void main(String[] args) throws ClassNotFoundExce ...

  4. JVM结构、GC工作机制详解

      JVM结构.内存分配.垃圾回收算法.垃圾收集器.下面我们一一来看. 一.JVM结构 根据<java虚拟机规范>规定,JVM的基本结构一般如下图所示: 从左图可知,JVM主要包括四个部分 ...

  5. JVM结构、GC工作机制详解(转)

    原文地址:http://blog.csdn.NET/tonytfjing/article/details/44278233 JVM结构.内存分配.垃圾回收算法.垃圾收集器.下面我们一一来看. 一.JV ...

  6. Java ClassLoader加载机制理解

    今天看到了一篇介绍Java ClassLoader加载机器的文章, 才发觉一直来自己的肤浅, 好好地给补了一课, 不得不存档! 原文地址: http://www.blogjava.net/lhulcn ...

  7. 从一个简单的main方法执行谈谈JVM工作机制

    本来JVM的工作原理浅到可以泛泛而谈,但如果真的想把JVM工作机制弄清楚,实在是很难,涉及到的知识领域太多.所以,本文通过简单的mian方法执行,浅谈JVM工作原理,看看JVM里面都发生了什么. 先上 ...

  8. 了解一下JVM和GC工作机制

    题外话:很久没有写博客了,事情颇多,今天空闲下来,学习一下顺便写一下自己的了解,机会总是留给有准备的人,所以平常一定要注意知识的巩固和积累.知识的深度也要有一定的理解,不比别人知道的多,公司干嘛选你? ...

  9. 【转载】JVM结构、GC工作机制详解

    文章主要分为以下四个部分 JVM结构.内存分配.垃圾回收算法.垃圾收集器.下面我们一一来看. 一.JVM结构 根据<java虚拟机规范>规定,JVM的基本结构一般如下图所示: 从左图可知, ...

随机推荐

  1. 嵌入式linux——时钟(三)

    今天写第一篇,S3C2440的时钟,配置好时钟系统,各个模块才能正常有效的工作,为了了解始终系统,必须要阅读芯片手册,尽量看英文版的,这样还能捎带着增加一下阅读英语计数文档的能力. 概览 在2440数 ...

  2. 新装 Win7 系统装完驱动精灵,一打开到检测界面就卡死——原因与解决方案

    1.现象: 重装系统后,鼠标反应慢,且不能上网.因此装了个驱动精灵,准备更新下驱动,但驱动精灵一打开到检测界面就卡死(换驱动人生.鲁大师也一样). 2.原因: Win7 系统 iso 中自带的驱动程序 ...

  3. Java好的的工具类:MD5

    import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class MD5 ...

  4. Delphi中Chrome Chromium、Cef3学习笔记(六)

    原文   http://blog.csdn.net/xtfnpgy/article/details/71703317   一.CEF加载网页时空白 chrm1.Load(‘你的网址’); 出现空白,跟 ...

  5. 把http网站变成https网站

    所需条件: 一个网站域名,必须是注册的合法域名,国内域名最好已经通过备案: 一个空间,可以是虚拟空间或者云主机: 一张SSL证书. 操作步骤: 域名注册.国内的有万网和国外GoDaddy,当然域名注册 ...

  6. Android Studio添加aar依赖

    将 implementation fileTree(dir: 'libs', include: ['*.jar']) 改为implementation fileTree(dir: 'libs', in ...

  7. Loadrunner Vugen参数列表中数据分配方法及更新值的时间9种组合说明及验证

    作为刚开始学习Loadrunner的新人,Data Assignment Method以及Update Method在相互组合之后,LR如何进行取值让我很是头疼. 于是花了一个晚上的时间认真学习官方文 ...

  8. hibernate的开始

    1.1对象的持久化 对象持久化是指将内存中的对象保存到可永久保存的存储设备中(如磁盘)的一种技术.(hibernate是通过id来管理对象) 1.2怎样实现持久化 1 对象序列化 2 JDBC 3 O ...

  9. 定时器&改变定时器的执行频率

    static System.Threading.Timer timer; static void Main(string[] args) { Console.WriteLine("Press ...

  10. Spring事务mysql不回滚:mysql引擎修改

    若Spring中@Transactional 注解开启且配置没问题的话,很可能是mysql数据库引擎不支持. mysql引擎是MyISAM的话事务会不起作用,原因是MyISAM不支持事务和外键,改成支 ...