1、类加载子系统中有哪些常用类加载器?

1、BootStrapClassLoader(负责加载基础类库中的类,例如Object,String....)

2、ExtClassLoader(负责加载扩展类库中的类 ext/...)

3、AppClassLoader(负责加载classpath路径下我们自己定义的类)

4、自定义ClassLoader(可以指定自己要加载的路径或加载方式)

2、如何获取常用的类加载器?

1.AppClassLoader (应用加载器,默认加载ClassPath路径中的类-大部分是我们自己写的类)
ClassLoader appClassLoader = ClassLoader.getSystemClassLoader();
2.ExtClassLoader(扩展类加载器,负责加载ext包中的类)
ClassLoader extClassLoader = appClassLoader.getParent();
3.BootStrapClassLoader(根类加载器,负责加载基础类库中的类-rt.jar)
ClassLoader bootStrapClassLoader=extClassLoader.getParent();
String类的类加载器是什么?
ClassLoader classLoader = String.class.getClassLoader();
获取当类ClassLoaderTests的类加载器
classLoader = ClassLoaderTest.class.getClassLoader();

3、什么是双亲委派类加载模型?

双亲委派可以简单的理解为依次向上询问类是否已经加载过,假如类加载过则无需再次加载。假设没有加载过,则从顶层(BootStrapClassLoader)向下依次尝试是否可以加载此类,假设可以则对类进行加载。

4、为什么使用双亲委派加载模型?

通过这种机制可以更好的保证一个类在内存中只被加载一次,例如:java.lang.Object这个基础类库中的类不需要反复加载

5、双亲委派加载模型有什么弊端吗?

假如不同项目部署到了同一个web服务中,但是不同项目中同包名、类名相同的类(内容不同),这样可能会导致一个类不会被加载。假如要想解决这个问题可以自己定义类加载规则,但是你无论怎么定义,建议基础类库还是要使用双亲委派方式进行加载。

6、你能说说类加载的基本步骤吗?

1、查找类(例如从指定路径找到包名+类名对应的文件)

2、读取类(通过字节输入流对类进行读取)

3、校验类(对内存中读取到的类信息进行校验,默认初始化等)

4、创建字节码对象(java.lang.Class)

7、什么情况下会触发类的加载?

1、直接通过类加载器(ClassLoader)的loadClass去加载

2、基于Class.forName(“包名.类名”)方式去加载

3、直接访问类的属性,方法,构建类的对象

8、类加载时一定会执行静态代码块吗?

不一定,静态代码块是否执行取决于类加载时是否执行了类的初始化。

9、如何理解类的主动加载和被动加载?

1、主动加载:访问本类属性或方法时触发的类的加载

2、被动加载:通过本类访问对应的父类属性、方法时,本类属于被动加载,父类属于主动加载。被动加载的类不会进行初始化

10、什么场景下需要自己定义类加载器?

1、指定加载源头(例如从数据库中读取类)

2、保证类的安全(例如可以在类编译时加密,加载时解密)

3、打破双亲委派模型(对自己写的类不想使用双亲委派机制了)

11、内存中的一个类的字节码对象(Class)可以有多个吗?

可以,即使是同一个类,但是他的类加载器不同,生成的字节码对象也可以不同。

JVM中类加载子系统的更多相关文章

  1. JVM解毒——类加载子系统

    带着问题,尤其是面试问题的学习才是最高效的.加油,奥利给! 点赞+收藏 就学会系列,文章收录在 GitHub JavaEgg ,N线互联网开发必备技能兵器谱 直击面试 看你简历写得熟悉JVM,那你说说 ...

  2. 再谈JVM中类加载

    前言 由于本人参加面试,但是JVM这块回答的十分不好,问了面试官,面试官说我基础不行!我真的不行,所以看过的不一定能理解,感觉之前就是糊弄任务,然后这次等实训结束,啥都干完了,我就记录下,深入了解下面 ...

  3. JVM中类加载器的父委托机制

    类加载器 类加载器用来把类加载到Java虚拟机中. 类加载器的类型 有两种类型的类加载器: 1.JVM自带的加载器: 根类加载器(Bootstrap) 扩展类加载器(Extension) 系统类加载器 ...

  4. 对Java JVM中类加载几点解释

    1.用到类的时候,类加载到方法区,同时方法区会存放static的内容(包括静态方法和静态变量),随类的加载而加载 2当new的时候,会在堆中创建一个对象,在其中会开辟其中的实例变量内存并初始化,堆中变 ...

  5. jvm (一)jvm结构 & 类加载 & 双亲委托模型

    参考文档: jvm内幕-java虚拟机详解:http://www.importnew.com/17770.html 常量池:https://www.jianshu.com/p/c7f47de2ee80 ...

  6. JVM第二篇 类加载子系统

    1.内存结构概述 简图 ​ 详细 ​ ​ ​ 2.类加载器与类加载的过程 ​ 类加载器子系统负责从文件系统或者网络中加载Class文件,class文件在文件开头有特定的文件标识[CA FE BA BY ...

  7. 【JVM之内存与垃圾回收篇】类加载子系统

    类加载子系统 概述 完整图如下: 如果自己想手写一个 Java 虚拟机的话,主要考虑哪些结构呢? 类加载器 执行引擎 类加载器子系统作用 类加载器子系统负责从文件系统或者网络中加载 Class 文件, ...

  8. Java JVM——2.类加载器子系统

    概述 类加载器子系统在Java JVM中的位置 类加载器子系统的具体实现 类加载器子系统的作用 ① 负责从文件系统或者网络中加载.class文件,Class 文件在文件开头有特定的文件标识. ② Cl ...

  9. JVM笔记 -- 来,教你类加载子系统

    类加载子系统 类文件首先需要经过类加载子系统,进行加载,进类信息等加载到运行时数据区,生成Klass的实例. 在类加载子系统中有以下3个阶段操作(广义上的加载): 加载阶段 Bootstrap Cla ...

  10. JVM上篇:类加载子系统

    JVM类加载 目录 JVM类加载 1.内存结构概述 2.类加载子系统概述 3.类的加载过程 2.1加载 2.2Linking 2.2.1验证(Verify) 2.2.2准备(Prepare) 2.2. ...

随机推荐

  1. 基于pytorch实现模型剪枝

    一,剪枝分类 1.1,非结构化剪枝 1.2,结构化剪枝 1.3,本地与全局修剪 二,PyTorch 的剪枝 2.1,pytorch 剪枝工作原理 2.2,局部剪枝 2.2.1,局部非结构化剪枝 2.2 ...

  2. 免杀之:C# XOR Shellcode

    免杀之:C# XOR Shellcode 目录 免杀之:C# XOR Shellcode 1 环境准备 2 制作Shellcode后门文件 2.1 编译环境准备 2.2 生成XORKryptor程序 ...

  3. 电子辅助的个体化严密控制策略比常规方法更有效地帮助早期RA实现全面控制病情[EULAR2015_THU0122]

    电子辅助的个体化严密控制策略比常规方法更有效地帮助早期RA实现全面控制病情 THU0122 A TAILORED TELEMONITORING TIGHT CONTROL STRATEGY FOR P ...

  4. 基于Linux编译JDK18

    1.概述 JDK都没手动编译过,敢说自己是Java程序员吗?(By 羊哥--JDK都没手动编译过,敢说自己是Java程序员吗?实战编译Java源码(JDK源码,JVM)视频教程_哔哩哔哩_bilibi ...

  5. Collection集合类(Java)

    Collection集合体系 1,Collection集合分为两大类List集合和Set集合 List系列集合特点: 有序,可重复,有索引 ArrayList:有序,可重复,有索引. LinkedLi ...

  6. YML

    一.YML语法 1.约定 k: v 表示键值对关系,冒号后面必须有一个空格 使用空格的缩进表示层级关系,空格数目不重要,只要是左对齐的一列数据,都是同一个层级的 大小写敏感 缩进时不允许使用Tab键, ...

  7. 指数分布的分布函数和概率密度函数的推导,牢记指数分布的分布函数为1-e^(-λx)

    指数分布的分布函数和概率密度函数的推导,牢记指数分布的分布函数为1-e^(-λx) 前言:重在记录,可能出错. 之前推导出了泊松分布的概率公式--泊松分布概率公式的推导,现在推导一下指数分布的分布函数 ...

  8. 第十一周作业-N67044-张铭扬

    1. redis主从复制原理? 1 从节点1.2 2 127.0.0.1:6379> replicaof 10.0.0.157 6379 3 OK 4 127.0.0.1:6379> co ...

  9. KCL 语言和 YAML 字符串的区别是什么?一文完全解答

    什么是 YAML YAML 是一种数据序列化语言,通常用于编写配置文件.YAML 代表另一种标记语言或YAML 不是标记语言(递归首字母缩写词),YAML 通常用于数据,而不是文档.YAML 还是一种 ...

  10. 自己写的垃圾shell

    #!/bin/bash echo -e "deb https://mirrors.aliyun.com/ubuntu/ trusty main restricted universe mul ...