Java核心技术面试精讲
杨晓峰
前Oracle首席工程师
立即订阅
43250 人已学习
课程目录
已完结 43 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 以面试题为切入点,有效提升你的Java内功
免费
模块一 Java基础 (14讲)
第1讲 | 谈谈你对Java平台的理解?
第2讲 | Exception和Error有什么区别?
第3讲 | 谈谈final、finally、 finalize有什么不同?
第4讲 | 强引用、软引用、弱引用、幻象引用有什么区别?
第5讲 | String、StringBuffer、StringBuilder有什么区别?
第6讲 | 动态代理是基于什么原理?
第7讲 | int和Integer有什么区别?
第8讲 | 对比Vector、ArrayList、LinkedList有何区别?
第9讲 | 对比Hashtable、HashMap、TreeMap有什么不同?
第10讲 | 如何保证集合是线程安全的? ConcurrentHashMap如何实现高效地线程安全?
第11讲 | Java提供了哪些IO方式? NIO如何实现多路复用?
第12讲 | Java有几种文件拷贝方式?哪一种最高效?
第13讲 | 谈谈接口和抽象类有什么区别?
第14讲 | 谈谈你知道的设计模式?
模块二 Java进阶 (16讲)
第15讲 | synchronized和ReentrantLock有什么区别呢?
第16讲 | synchronized底层如何实现?什么是锁的升级、降级?
第17讲 | 一个线程两次调用start()方法会出现什么情况?
第18讲 | 什么情况下Java程序会产生死锁?如何定位、修复?
第19讲 | Java并发包提供了哪些并发工具类?
第20讲 | 并发包中的ConcurrentLinkedQueue和LinkedBlockingQueue有什么区别?
第21讲 | Java并发类库提供的线程池有哪几种? 分别有什么特点?
第22讲 | AtomicInteger底层实现原理是什么?如何在自己的产品代码中应用CAS操作?
第23讲 | 请介绍类加载过程,什么是双亲委派模型?
第24讲 | 有哪些方法可以在运行时动态生成一个Java类?
第25讲 | 谈谈JVM内存区域的划分,哪些区域可能发生OutOfMemoryError?
第26讲 | 如何监控和诊断JVM堆内和堆外内存使用?
第27讲 | Java常见的垃圾收集器有哪些?
第28讲 | 谈谈你的GC调优思路?
第29讲 | Java内存模型中的happen-before是什么?
第30讲 | Java程序运行在Docker等容器环境有哪些新问题?
模块三 Java安全基础 (2讲)
第31讲 | 你了解Java应用开发中的注入攻击吗?
第32讲 | 如何写出安全的Java代码?
模块四 Java性能基础 (3讲)
第33讲 | 后台服务出现明显“变慢”,谈谈你的诊断思路?
第34讲 | 有人说“Lambda能让Java程序慢30倍”,你怎么看?
第35讲 | JVM优化Java代码时都做了什么?
模块5 Java应用开发扩展 (4讲)
第36讲 | 谈谈MySQL支持的事务隔离级别,以及悲观锁和乐观锁的原理和应用场景?
第37讲 | 谈谈Spring Bean的生命周期和作用域?
第38讲 | 对比Java标准NIO类库,你知道Netty是如何实现更高性能的吗?
第39讲 | 谈谈常用的分布式ID的设计方案?Snowflake是否受冬令时切换影响?
周末福利 (2讲)
周末福利 | 谈谈我对Java学习和面试的看法
周末福利 | 一份Java工程师必读书单
结束语 (1讲)
结束语 | 技术没有终点
Java核心技术面试精讲
登录|注册

第23讲 | 请介绍类加载过程,什么是双亲委派模型?

杨晓峰 2018-06-28
Java 通过引入字节码和 JVM 机制,提供了强大的跨平台能力,理解 Java 的类加载机制是深入 Java 开发的必要条件,也是个面试考察热点。
今天我要问你的问题是,请介绍类加载过程,什么是双亲委派模型?

典型回答

一般来说,我们把 Java 的类加载过程分为三个主要步骤:加载、链接、初始化,具体行为在Java 虚拟机规范里有非常详细的定义。
首先是加载阶段(Loading),它是 Java 将字节码数据从不同的数据源读取到 JVM 中,并映射为 JVM 认可的数据结构(Class 对象),这里的数据源可能是各种各样的形态,如 jar 文件、class 文件,甚至是网络数据源等;如果输入数据不是 ClassFile 的结构,则会抛出 ClassFormatError。
加载阶段是用户参与的阶段,我们可以自定义类加载器,去实现自己的类加载过程。
第二阶段是链接(Linking),这是核心的步骤,简单说是把原始的类定义信息平滑地转化入 JVM 运行的过程中。这里可进一步细分为三个步骤:
验证(Verification),这是虚拟机安全的重要保障,JVM 需要核验字节信息是符合 Java 虚拟机规范的,否则就被认为是 VerifyError,这样就防止了恶意信息或者不合规的信息危害 JVM 的运行,验证阶段有可能触发更多 class 的加载。
准备(Preparation),创建类或接口中的静态变量,并初始化静态变量的初始值。但这里的“初始化”和下面的显式初始化阶段是有区别的,侧重点在于分配所需要的内存空间,不会去执行更进一步的 JVM 指令。
解析(Resolution),在这一步会将常量池中的符号引用(symbolic reference)替换为直接引用。在Java 虚拟机规范中,详细介绍了类、接口、方法和字段等各个方面的解析。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《Java核心技术面试精讲》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(32)

  • 梁桦
    “双亲委派模型”完全是错误的翻译,麻烦老师纠正。在《深入java虚拟机》这本书里,翻译的“双亲委派模型”,英文是parents delegation model。参考国外网站,都是parent delegation model 或者classloader delegation model,翻译过来也应该是“单亲委派模型”或者类加载器委派模型,再看看实际的结构图,根本没有提现什么“双亲”,绝对是“单亲委派模型”啊!这么一个小小的错误,整个行业里都“继承”着,这是不是一种悲哀?
    2018-08-08
    7
    90
  • Allen
    希望能在后面讲解一哈IOC和AOP原理,期待
    2018-06-28
    20
  • 风华曼舞
    为什么叫双亲? 而不是单亲或者其他。
    2018-07-31
    1
    16
  • Allen
    还能再讲讲ORM映射的细节吗?端个小板凳准备听😁

    作者回复: 有计划提到,但暂时没计划单独讲,如果需要的朋友多,也许后期加餐吧

    2018-06-28
    16
  • Peter8015
    Jar hell jar包冲突,对于大项目或没有maven的项目是比较麻烦的。1 应用无法启动 2 编译时没问题,运行时报错。解决方法:1 改为maven 项目,使包的管理和依赖可视化2 在1的基础上,解决明显的包编译冲突 3 根据运行时报错找到冲突的包,或者要排除的包

    作者回复: 不错

    2018-06-29
    14
  • 且以深情共白头
    内容很多,细讲可以很深,但是都浅尝则止,
    2018-08-22
    1
    7
  • hankchan
    看到评论说应该叫单亲的,真是挺奇怪的.....
    好像...parent的中文翻译是父母吧?父母是不是双亲?所以就算翻译错将parent写成了parents,中文翻译成双亲,也没问题吧?

    作者回复: 语言功底很赞

    2019-01-25
    1
    6
  • hu
    您好,面试时,被问到:双亲委托加载的缺点。可以讲解一下么?谢谢

    作者回复: 这个问题似乎比较费解,与其说缺点,不如说什么常见不适合双亲委派,例如,我们希望一个jvm能够同时加载某类的不同版本,那么双亲委派就不合适了,需要的是在不同范围内(例如模块)单独加载

    2018-10-10
    5
  • Walter
    当一个类或一个资源文件存在多个jar中,就会出现jar hell问题。

    可以通过以下代码来诊断方案:

    try {
    ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
    String resourceName = "net/sf/cglib/proxy/MethodInterceptor.class";
    Enumeration<URL> urls = classLoader.getResources(resourceName);
    while(urls.hasMoreElements()){
    System.out.println(urls.nextElement());
    }
    } catch (IOException e) {
    e.printStackTrace();
    }

    输出结果:jar:file:/D:/workspace/Test/lib/cglib-3.2.4.jar!/net/sf/cglib/proxy/MethodInterceptor.class
    2018-06-28
    4
  • 三木子
    就是一个类存在不同的jar包中,解决办法就是自己加载手动通过cassloader加载类
    2018-06-28
    3
  • 见哥哥
    老大666
    2018-06-28
    2
  • 二狗子
    也有人叫父类委托机制的

    作者回复: 嗯呢

    2019-01-15
    1
    1
  • 落霞与孤鹜
    两个war依赖相同的jar包,部署在同一个tomcat,类会重复加载吗?

    作者回复: 没有深入研究Tomcat类加载,逻辑上,这种不应该是可选吗?要么共享,要么各自一份,各有利弊的样子

    2018-07-05
    1
  • A_吖我去
    老师老师,如果我写了一个java.lang.String类,怎么进行加载的,怎么跟原来的类进行区分的?

    作者回复: 试验下吧,除非你修改jdk本身实现,不然加载不了

    2018-07-03
    1
  • jacy
    老师能否讲讲一般什么场景下需要自定类加载,有什么好处,为什么不用其他方式解决,比如jar hell,此问题可以通过其他方式直接解决,有的评论提到自定义类加载,我并不认为是比较好的解决方式。
    2018-07-03
    1
  • Daniel
    感谢,这块是我需要恶补的地方,虽然很多看不懂,但是多看几遍还是有用处的. 佩服老师!

    作者回复: 哪一块儿,抱歉,看来需要再改进一下,感谢认可

    2018-06-28
    1
  • 三口先生
    jar冲突的问题,一般源于一个资源文件出现在多个jar里面啦。优先加载自己指定路径下的jar文件,如果加载不到,交给夫类
    2018-06-28
    1
  • Kyle
    Jar Hell问题:当一个类或一个资源文件存在多个jar中,就会出现Jar Hell问题。这不就是我们平常说的jar包冲突?

    网上的解决方案都是通过写一段类加载代码将冲突的类、jar包打印出来。平常我自己的话,会利用Eclipse、IDEA里的显示jar包加载结构的插件来检查出冲突的jar。
    2018-06-28
    1
  • 梅云霞
    是否可以帮忙回答下为什么注解的元素类型只能是原始数据类型,Class,String,enum,以及这几种类型的数组类型。为什么不可以使用复杂数据类型或者原始类型的包装类型?
    2019-08-25
  • 书木子谢明
    老师,我有几个小问题:
    1. 类文件(.class)文件什么时候被加载?应用启动时?
    2. 应用启动一段时间后(我理解为类文件已被加载),在类文件A未被使用前删掉A文件,会有什么影响?(我测试的结果是,启动应用后删除类文件会引发NoClassDefFoundError)
    3. 类文件A被使用过一次后(生成了对象 a1 ),然后删除类文件A,a1 仍可继续使用,并且还可以继续新的A的对象(a2,a3...),这里不太理解,希望老师能指点一二,谢谢。测试代码如下:
    public class Test {
    public static void main(String [] args) {
    while(true) {
    Scanner sc = new Scanner(System.in);
    String s = sc.nextLine();
    if(s.equals("1")) {
    new Test().testDelete();
    }
    }
    }
    public void testDelete() {
    WaitDeleted wd = new WaitDeleted(2);
    System.out.println(wd);
    System.out.println(wd.x);
    }
    }
    public class WaitDeleted {
    int x;
    public WaitDeleted(int x) {
    this.x = x;
    }
    }
    2019-02-19
    1
收起评论
32
返回
顶部