问题:请讲下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. Dev GridControl列绑定LookUpEdit数据源:默认值

    在Winform开发过程中,GridControl控件是比较常见的,尤其是其数据源的灵活性,为我们提供了不少的便利. 在使用Dev的GridControl的时候,有时候会在列的Column Edit属 ...

  2. Oracle VM VirtualBox安装CentOS7

    安装VirtualBox6.0 下载地址:https://www.virtualbox.org/ 新建虚拟机 类型:Linux 版本:Other Linux(64-bit)----如果没有出现64-b ...

  3. 字符串拼接出现null的问题

    最近在开发的过程中遇到这样的问题,原因是在做一个需求的时候,要求将解密的号码和前缀进行拼接.一开始在这个拼接的过程中,没有考虑到数据校验的问题,因为有可能他的前缀或者其他需要拼接的字段在前端传递的过程 ...

  4. 基于element-ui封装一个Table模板组件

    大家在做后台管理系统的时候,写的最多的可能就是表格页面了,一般分三部分:搜索功能区.表格内容区和分页器区.一般这些功能都是使用第三方组件库实现,比如说element-ui,或者vuetify.这两个组 ...

  5. 微信小程序切换标签改变样式

    微信小程序切换标签改变样式 wxml <!--顶部导航栏--> <view class="swiper-tab"> <view class=" ...

  6. wxWidgets源码分析(7) - 窗口尺寸

    目录 窗口尺寸 概述 窗口Size消息的处理 用户调整Size消息的处理 调整窗口大小 程序调整窗口大小 wxScrolledWindow设置窗口大小 获取TextCtrl控件最合适大小 窗口尺寸 概 ...

  7. Deep Unfolding Network for Image Super-Resolution 论文解读

    Introduction 超分是一个在 low level CV 领域中经典的病态问题,比如增强图像视觉质量.改善其他 high level 视觉任务的表现.Zhang Kai 老师这篇文章在我看到的 ...

  8. celery 与 flask 实现异步任务调度

    Flask 定了2中上下文,来实现机遇线程\协程的,wsgi服务的请求(request.session)和存储(g,current_app )过程,通过栈来完成不同线程和协程的上下文切换,在与cele ...

  9. 让你的浏览器变成Siri一样的语音助手

    最近业余时间浏览技术文章的时候,看到了一篇关于语音朗读的文章:Use JavaScript to Make Your Browser Speak(用Javascript让你的浏览器说话),文章中提到可 ...

  10. 上万字详解Spark Core(建议收藏)

    先来一个问题,也是面试中常问的: Spark为什么会流行? 原因1:优秀的数据模型和丰富计算抽象 Spark 产生之前,已经有MapReduce这类非常成熟的计算系统存在了,并提供了高层次的API(m ...