问题:请讲下java的类加载机制及过程

分析:该问题主要考察对JVM加载类的机制及过程,延申出的问题是为什么使用双亲委托模型,有什么办法可以打破双亲委托吗;

回答要点:

主要从以下几点去考虑,

1、类加载的过程?

2、类加载的机制?

3、如何打破双亲委托模型?

在运行java程序时,一个类必须要加载到内存中才可以被使用,那么这个加载的过程是什么样子的那

类加载的过程分为下面三个阶段

加载

所谓加载,就是把字节码文件(java编译器会把源文件编译为字节码文件)加载到JVM中,并且映射为JVM可以识别的数据结构,也就是Class对象;字节码的来源可以是网络、数据库、jar等格式,这个过程是用户可以参与的过程,可以自定义类加载器实现加载的过程;

连接

这一步是核心的过程,要把上个阶段的Class文件,转化为JVM运行时的数据结构,分为三个步骤,验证、准备、解析;

验证

验证主要是验证字节码是否符合JVM虚拟机的规范,主要从安全方面进行考虑。

准备

准备阶段主要是针对类或接口中的静态变量,对类变量进行创建并赋初值,这里的初值是对应的类型的默认值;

解析

将符号引用转化为直接引用

初始化

执行类初始化的操作,包括静态变量的赋值,静态代码块的执行等;

上面说了类加载的过程,那么一个类加载的机制是什么那

java中类加载遵循双亲委托模型。类加载首先要有类加载器,java提供了3种类加载器,bootstrapClassLoader、ExtClassLoader、ApplicationClassLoader,其中bootstrapClassLoader没有父加载器。一个类被加载时,默认情况下会使用ApplicationClassLoader进行加载,ApplicationClassLoader会查找自己的缓存,如果换成中没加载过该类,则会委托给其父类加载器ExtClassLoader去加载,ExtClassLoader同样去查找自己的缓存,如果缓存中没有则委托给其父类BoostrapClassLoader去加载,BootstrapClassLoader查找自己的缓存,如果缓存中没有,则它会尝试自己去加载(它没有父加载器),如果它加载不了,则交给ExtClassLoader去加载,ExtClassLoader无法加载的话,就会交给ApplicaitonClassLoader去加载,如果都加载不了的话则会抛出异常。

使用双亲委托的好处就是防止类被重复加载,保证一个类只能由一个类加载器加载;保证JDK类库的安全;

如何打破双亲委托那

1、可以自定义类加载器,继承抽象类ClassLoader,重写其loadClass方法,该方法中实现的就是双亲委托的代码;同时要重写因为该方法是一个抽象方法,需要定义该类从什么地方加载字节码;

2、SPI机制,service provider interface 是一套接口,这套接口由java来提供,但是具体实现由第三方来提供,例如,java.sql包就定义了一组数据库访问规范,但是并没有提供具体的实现,具体的实现由各数据库厂商提供;

java面试一日一题:java的类加载过程的更多相关文章

  1. java面试一日一题:讲下在什么情况下会发生类加载

    问题:请讲下在什么情况下会发生类加载? 分析:该问题主要考察对java中类加载的知识,什么是类加载,为什么会发生类加载,什么情况下发生类加载? 回答要点: 主要从以下几点去考虑 1.什么是类加载: 2 ...

  2. java面试一日一题:mysql中常用的存储引擎有哪些?

    问题:请讲下mysql中常用的引擎有哪些? 分析:该问题主要考察对mysql存储引擎的理解,及区别是什么? 回答要点: 主要从以下几点去考虑, 1.mysql的存储引擎的基本概念? 2.mysql中常 ...

  3. java面试一日一题:讲下mysql中的undolog

    问题:请讲下mysql中undo log的作用 分析:mysql中有很多日志,例,bin log undo log redo log,要弄清楚这些日志的作用,就要了解这些日志出现的背景及要解决的问题: ...

  4. java面试一日一题:java中垃圾回收算法有哪些

    问题:请讲下在java中有哪些垃圾回收算法 分析:该问题主要考察对java中垃圾回收的算法以及使用场景 回答要点: 主要从以下几点去考虑, 1.GC回收算法有哪些 2.每种算法的使用场景 3.基于垃圾 ...

  5. java面试一日一题:java中的垃圾回收器

    问题:请讲下java中垃圾回收器有哪些? 分析:该问题主要考察hotspot虚拟机下实现的垃圾回收器 回答要点: 主要从以下几点去考虑, 1.垃圾回收器的种类 2.每种垃圾回收器的着重点是什么 前边的 ...

  6. java面试一日一题:java线程池

    问题:请讲下java中的线程池 分析:在面试中经常问到线程池的问题,要掌握其基本概念,使用方法,注意事项等,引申下tomcat中默认的线程数是多少 回答要点: 主要从以下几点去考虑, 1.为什么要使用 ...

  7. java面试一日一题:讲对mysql的MVCC的理解

    问题:请讲下对mysql中MVCC的理解 分析:这个问题要回答的是对MVCC的理解,以及MVCC解决了什么问题这几个方面入手. 回答要点: 主要从以下几点去考虑, 1.什么是MVCC? 2.MVCC用 ...

  8. java面试一日一题:如何判断一个对象是否为垃圾对象

    问题:请讲下在java中如何判断一个对象是否为垃圾 分析:该问题主要考察对java中的垃圾回收,用什么方式去识别一个对象是垃圾: 回答要点: 主要从以下几点去考虑, 1.GC回收的是什么,回收发生在内 ...

  9. java面试一日一题:如何设计一款垃圾回收器

    问题:如果让你设计一个垃圾回收器,你会考虑哪些问题 分析:该问题主要考察对java中垃圾回收器的理解,要理解怎么回收:一款好的垃圾回收器有哪些衡量指标 回答要点: 主要从以下几点去考虑, 1.垃圾回收 ...

随机推荐

  1. 微信小程序:页面全局参数(注意不是小程序的全局变量globalData)

    为什么要使用页面全局参数:方便使用数据. 由于总页数需要再另外的一个方法中使用,所以要把总页数变成一个页面全局参数.因为取数据使用this.xxx即可,中间不用加data,给页面全局参数赋值页方便,直 ...

  2. Android 开发学习进程0.28 腾讯TBS接入和相关问题

    TBS 的接入和使用 TBS 的接入 腾讯TBS是X5内核的升级版,可以当作webview 来打开 网页,可以以用来打开docx doc pdf 等文件,这里主要使用的是文件功能. 依赖接入 api ...

  3. Innodb的存储及缓存

    参考[mysql技术内幕] 一.mysql体系结构和存储引擎 1.数据库与数据库实例 数据库:物理操作系统文件或者其他文件组成的集合: 数据库实例:有数据库后台进程/线程和一个共享内存区域组成. 数据 ...

  4. hexo 报错 use_date_for_updated is deprecated...

    hexo 报错 use_date_for_updated is deprecated... WARN Deprecated config detected: "use_date_for_up ...

  5. js中数据、内存、变量的概念及三者之间的关系

    目录 数据.内存.变量的概念及三者之间的关系 什么是数据 数据的特点 什么是内存 栈内存 堆内存 JS引擎如何管理内存 什么是变量 变量是普通类型时 变量是引用类型时 数据.内存.变量的三者之间的关系 ...

  6. git仓库创建及基本使用

    创建git用户 useradd git passwd git 创建目录 mkdir /home/git/repos/app.git/ -p 初始化目录 cd /home/git/repos/app.g ...

  7. 不用代码趣讲 ZooKeeper 集群

    本文作者:HelloGitHub-老荀 Hi,这里是 HelloGitHub 推出的 HelloZooKeeper 系列,免费开源.有趣.入门级的 ZooKeeper 教程,面向有编程基础的新手. 项 ...

  8. EurekaServer源码分析

    Eureka Server功能 接受服务注册 接受服务心跳 服务剔除 服务下线 集群同步 获取注册表中服务实例信息 需要注意的是,Eureka Server同时也是一个Eureka Client,在不 ...

  9. 任务队列 与 Celery概述

    一.任务队列(Task Queues) 1.1 什么是任务队列? 任务队列用于管理后台工作,通常这些后台工作必须在 HTTP请求-响应循环 之外执行. 1.2 为什么需要任务队列? 对于那些不是由客户 ...

  10. FreeBSD 将降低对 i386 架构的支持力度

    FreeBSD 开发团队宣布,从 FreeBSD 13.0 开始,对 i386 架构的支持级别将降级为 Tier 2,未来的 14.0 可能还将会在此基础上进一步降低对 i386 架构的支持.而对于 ...