背景

类加载机制作为一个高频的面试题经常会在面试中被问到,前几天一个电话面试就问到,之前有了解过,但是没有梳理成自己的体系,所以说的有点凌乱,今天花点时间整理一下,分享给大家同时自己也好好梳理一下,顺便帮助一下有需要的人。

 

 

什么是类加载机制

众所周知我们编写的 Java 文件都是以.java 为后缀的文件,编译器会将我们编写的.java 的文件编译成.class 文件,简单来说类加载机制就是从文件系统将一系列的 class 文件读入 JVM 内存中为后续程序运行提供资源的动作。

 

 

类加载的流程

我们先看下类加载的过程中有哪些阶段,后面再对其一一解释做了什么

简单画了一个图,从上图我们可以看出,类加载的整个过程有五个阶段,下面分别解释每个过程做了什么。

 

加载

 

通过一个类的完整路径查找此类字节码文件(class 文件即二进制文件)。将二进制文件的静态存储结构转化为方法区的运行时数据结构并利用二进制流文件创建一个Class对象,存储在 Java 堆中用于对方法区的数据结构引用的入口;

 

1.class 文件的来源:有一点需要注意的是类加载机制不仅可以从文件系统读取 class 文件,也可以通过网络获取,其他 jar 包或者其他程序生成,如 JSP 应用。

 

2.类加载器:讲到类加载不得不讲到类加载的顺序和类加载器。Java 中大概有四种类加载器,分别是:启动类加载器(Bootstrap ClassLoader),扩展类加载器(Extension ClassLoader),系统类加载器(System ClassLoader),自定义类加载器(Custom ClassLoader),依次属于继承关系(注意这里的继承不是 Java 类里面的 extends。

3.启动类加载器(Bootstrap ClassLoader):主要负责加载存放在Java_Home/jre/lib下,或被-Xbootclasspath参数指定的路径下的,并且能被虚拟机识别的类库(如rt.jar,所有的java.*开头的类均被Bootstrap ClassLoader加载),启动类加载器是无法被Java程序直接引用的。

4.扩展类加载器(Extension ClassLoader):主要负责加载器由sun.misc.Launcher$ExtClassLoader实现,它负责加载Java_Home/jre/lib/ext目录中,或者由java.ext.dirs系统变量指定的路径中的所有类库(如javax.*开头的类),开发者可以直接使用扩展类加载器。

5.系统类加载器(System ClassLoader):主要负责加载器由sun.misc.Launcher$AppClassLoader来实现,它负责加载用户类路径(ClassPath)所指定的类,开发者可以直接使用该类加载器,如果应用程序中没有自定义过自己的类加载器,一般情况下这个就是程序中默认的类加载器。

6.自定义类加载器(Custom ClassLoader:自己开发的类加载器

 

7.双亲委派原则:类加载器在加载 class 文件的时候,遵从双亲委派原则,意思是加载依次由父加载器先执行加载动作,只有当父加载器没有加载到 class 文件时才由子类加载器进行加载。这种机制很好的保证了 Java API 的安全性,使得 JDK 的代码不会被篡改。

验证

验证的过程只要是保证 class 文件的安全性和正确性,确保加载了该 class 文件不会导致 JVM 出现任何异常,不会危害JVM 的自身安全。验证包括对文件格式的验证,元数据和字节码的验证。

 

准备

准备阶段是为类变量进行内存分配和初始化零值的过程。注意这时候分配的是类变量的内存,这些内存会在方法区中分配。此时不会分配实例变量的内存,因为实例变量是在实例化对象时一起创建在Java 堆中的。而且此时类变量是赋值为零值,即 int 类型的零值为 0,引用类型零值为 null,而不是代码中显示赋值的数值。

 

解析

解析阶段是虚拟机将常量池中的符号引用转化为直接引用的过程。在 class 文件中常量池里面存放了字面量和符号引用,符号引用包括类和接口的全限定名以及字段和方法的名称与描述符。在 JVM 动态链接的时候需要根据这些符号引用来转换为直接引用存放内存使用。

 

初始化

初始化的阶段是类加载的最后一步,这个阶段主要是执行 java 代码,进行相关初始化的动作。

 

总结

整个类加载机制是我们程序运行的开始,虽然这些动作都是 JVM 帮我们自动完成,开发人员在不需要定制类加载器的时候是不会涉及到底层细节的,但是作为一个有追求的程序员,我们还是要知道一些原理,这样不管是在面试的时候还是对自己的提升都有很大的帮助。


Java 极客技术公众号,是由一群热爱 Java 开发的技术人组建成立,专注分享原创、高质量的 Java 文章。如果您觉得我们的文章还不错,请帮忙赞赏、在看、转发支持,鼓励我们分享出更好的文章。

关注公众号,大家可以在公众号后台回复“博客园”,免费获得作者 Java 知识体系/面试必看资料。

转载于:https://www.cnblogs.com/justdojava/p/11211586.html

今天来聊Java ClassLoader相关推荐

  1. Java ClassLoader详解

    翻译原文链接 背景 Java平台旨在提供健壮,安全和可扩展的功能,以支持代码和数据的移动性.Java虚拟机(JVM)中的Java ClassLoader是实现这些目标的关键组件. JVM负责在Java ...

  2. 与Brian Goetz聊Java的数据类

    \ 看新闻很累?看技术新闻更累?试试下载InfoQ手机客户端,每天上下班路上听新闻,有趣还有料! \ \\ 作为Oracle的Java语言架构师,Brian Goetz一直致力于Java编程语言在生产 ...

  3. Java继承_Hachi君浅聊Java三大特性之 封装 继承 多态

    Hello,大家好~我是你们的Hachi君,一个来自某学院的资深java小白.最近利用暑假的时间,修得满腔java语言学习心得.今天小宇宙终于要爆发了,决定在知乎上来一场根本停不下来的Hachi君个人 ...

  4. [转载] 深入了解Java ClassLoader、Bytecode 、ASM、cglib

    转载自http://www.iteye.com/topic/98178 一.Java ClassLoader 1,什么是ClassLoader  与 C 或 C++ 编写的程序不同,Java 程序并不 ...

  5. Java ClassLoader

    Java ClassLoader (1) – What is a ClassLoader? Java ClassLoader (2) – Write your own ClassLoader Java ...

  6. 深入理解Java ClassLoader及在 JavaAgent 中的应用

    转载自   深入理解Java ClassLoader及在 JavaAgent 中的应用 背景 众所周知, Java 或者其他运行在 JVM(java 虚拟机)上面的程序都需要最终便以为字节码,然后被 ...

  7. 了解和扩展Java ClassLoader

    Java ClassLoader是项目开发中Java的关键但很少使用的组件之一. 就我个人而言,我从未在任何项目中扩展ClassLoader,但是拥有自己的可以自定义Java类加载的ClassLoad ...

  8. java面试题28 牛客 下面有关java classloader说法错误的是?

    java面试题28 牛客 下面有关java classloader说法错误的是? A Java默认提供的三个ClassLoader是BootStrap ClassLoader,Extension Cl ...

  9. 深入了解Java ClassLoader、Bytecode 、ASM、cglib (I)

    http://hi.baidu.com/maoshenmusic/blog/item/5e65dc2419baa6044c088d1a.html 一.Java ClassLoader 1,什么是Cla ...

  10. 老大难的 Java ClassLoader 再不理解就老了

    老大难的 Java ClassLoader 再不理解就老了 ClassLoader 是 Java 届最为神秘的技术之一,无数人被它伤透了脑筋,摸不清门道究竟在哪里.网上的文章也是一篇又一篇,经过本人的 ...

最新文章

  1. linux+Oracle集群课程全面升级
  2. Dynamics 365-关于Solution的那些事(一)
  3. Elasticsearch中如何进行日期(数值)范围查询
  4. 2013/8月读书计划
  5. telnet 查看端口是否可访问
  6. Android开源工具项目集合
  7. Centos 7安装与配置nagios监控(一)
  8. CodeEditPro2.1基础使用——打开文件,查看波形图及语谱图
  9. create-react-app 自定义 eslint 配置
  10. SELinux 基础命令
  11. Redfish接口测试
  12. librtmp源码详解
  13. 计算机打字速度在线测试,在线测试打字速度(一分钟打字速度测试)
  14. 神经网络的心得体会,神经网络心得体会
  15. K-means算法详解及实现
  16. python导入siri_python利用不到一百行代码实现一个小siri
  17. 毕设第三周(12月19日——12月25日)
  18. JS:Caesars Cipher(凯撒密码)
  19. 计算机网络原理fin,一个动画看懂网络原理之TCP建立和释放过程
  20. “无法删除数据库,因为该数据库当前正在使用“问题解决

热门文章

  1. Python机器学习库sklearn自动特征选择(训练集)
  2. Java多线程系列--“JUC线程池”
  3. Windows下Python安装numpy+mkl,Scipy和statsmodels
  4. mysql like in 组合_mysql like in 组合 黄小柔junior分手原因
  5. 2021-06-24边框塌陷解决方案
  6. java hostnameverifier_关于HostnameVerifier接口的解读
  7. python开发技术文档范文_常用python编程模板汇总
  8. 上位机与1200组态步骤_新入S7-1200系统值得注意几点(博图平台)
  9. ❤️Docker教程小白实操入门 教程合集❤️
  10. 【Django 2021年最新版教程36】 python django runserver 后台运行