JVM中类加载子系统
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中类加载子系统的更多相关文章
- JVM解毒——类加载子系统
带着问题,尤其是面试问题的学习才是最高效的.加油,奥利给! 点赞+收藏 就学会系列,文章收录在 GitHub JavaEgg ,N线互联网开发必备技能兵器谱 直击面试 看你简历写得熟悉JVM,那你说说 ...
- 再谈JVM中类加载
前言 由于本人参加面试,但是JVM这块回答的十分不好,问了面试官,面试官说我基础不行!我真的不行,所以看过的不一定能理解,感觉之前就是糊弄任务,然后这次等实训结束,啥都干完了,我就记录下,深入了解下面 ...
- JVM中类加载器的父委托机制
类加载器 类加载器用来把类加载到Java虚拟机中. 类加载器的类型 有两种类型的类加载器: 1.JVM自带的加载器: 根类加载器(Bootstrap) 扩展类加载器(Extension) 系统类加载器 ...
- 对Java JVM中类加载几点解释
1.用到类的时候,类加载到方法区,同时方法区会存放static的内容(包括静态方法和静态变量),随类的加载而加载 2当new的时候,会在堆中创建一个对象,在其中会开辟其中的实例变量内存并初始化,堆中变 ...
- jvm (一)jvm结构 & 类加载 & 双亲委托模型
参考文档: jvm内幕-java虚拟机详解:http://www.importnew.com/17770.html 常量池:https://www.jianshu.com/p/c7f47de2ee80 ...
- JVM第二篇 类加载子系统
1.内存结构概述 简图 详细 2.类加载器与类加载的过程 类加载器子系统负责从文件系统或者网络中加载Class文件,class文件在文件开头有特定的文件标识[CA FE BA BY ...
- 【JVM之内存与垃圾回收篇】类加载子系统
类加载子系统 概述 完整图如下: 如果自己想手写一个 Java 虚拟机的话,主要考虑哪些结构呢? 类加载器 执行引擎 类加载器子系统作用 类加载器子系统负责从文件系统或者网络中加载 Class 文件, ...
- Java JVM——2.类加载器子系统
概述 类加载器子系统在Java JVM中的位置 类加载器子系统的具体实现 类加载器子系统的作用 ① 负责从文件系统或者网络中加载.class文件,Class 文件在文件开头有特定的文件标识. ② Cl ...
- JVM笔记 -- 来,教你类加载子系统
类加载子系统 类文件首先需要经过类加载子系统,进行加载,进类信息等加载到运行时数据区,生成Klass的实例. 在类加载子系统中有以下3个阶段操作(广义上的加载): 加载阶段 Bootstrap Cla ...
- JVM上篇:类加载子系统
JVM类加载 目录 JVM类加载 1.内存结构概述 2.类加载子系统概述 3.类的加载过程 2.1加载 2.2Linking 2.2.1验证(Verify) 2.2.2准备(Prepare) 2.2. ...
随机推荐
- Shell命令-常用操作
Shell基础 1 Shell命令的基本格式 基本格式 command [选项] [参数] []表示可选的,也就是可有可无.有些命令不写选项和参数也能执行,有些命令在必要的时候可以附带选项和参数. 短 ...
- 常见数据库mysql、oracle和DB2中is null 和 =null 的区别
问题背景:前段时间我在测试过程中上传一个文件,文件内容要求判断为空,结果出现了报错,跟踪原因发现是开发误将oracle中对null的判断方式写成了=null,下面梳理一下不同数据库对该问题的处理方法: ...
- VSCode 自定义代码片段
Ctrl+Shift+P 输入"代码片段:配置用户代码片段": 搜索你想要设置的语言代码片段,比如,我设置 .vue 文件的代码片段,选择 vue.json: 可以配置多个代码片段 ...
- mongodump导出mongodb中的数据
如果数据量小,用navicat或者其它客户端可以很方便的导出数据,但如果数据量比较大的话,建议用mongo官方工具 mongodump 下载地址: https://www.mongodb.com/tr ...
- pytorch 衣服等
衣服 pytorch BP神经网路 猫狗
- [WinError 10061] 由于目标计算机积极拒绝,无法连接。- EnlightenGan运行
在测试EnlightenGan时,可视化结果保存出现问题. 原因:调用visdom可视化,需要先打开visdom python -m visdom.server
- Linux驱动、应用调试技巧
原文地址:https://hceng.cn/2019/04/08/Linux%E9%A9%B1%E5%8A%A8%E3%80%81%E5%BA%94%E7%94%A8%E8%B0%83%E8%AF%9 ...
- Mysql习题系列(一):基本select语句与运算符
Mysql8.0习题系列 软件下载地址 提取码:7v7u 数据下载地址 提取码:e6p9 文章目录 Mysql8.0习题系列 1. 基本select语句 1.1 题目 1.2答案 1.查询员工12个月 ...
- C++实现链栈相关操作代码
#include<iostream>#include<cstdlib>using namespace std;#define MAXSIZE 100#define OK 1#d ...
- 了解ASP(二)
变量 ASP中的变量有普通变量,Session变量,Application变量. 变量的生存期 在子程序外声明的变量可被 ASP 文件中的任何脚本访问和修改. 在子程序中声明的变量只有当子程序每次执行 ...