jvm:类加载子系统干什么的?由什么组成?需要记住哪些八股文?
最近刚工作,有点懈怠了,看抖音的时候,发现大家都在学jvm,正好咕咕也在这方面一直有想要学习的东西,就参考了一下别人,学习了b站尚硅谷康老师的视频,确实讲得挺细的。打算看一点记录一点。
最近看完了前面30多个视屏,主要是讲类加载子系统。
稍微了解一点jvm,会知道jvm主要包括类加载子系统,运行时数据区,和执行引擎。
这里写目录标题
- jvm:类加载子系统干什么的?由什么组成?需要记住哪些八股文?
- 三级目录
- 类装载子系统作用:
- 1.加载器有哪些“?
- 2.用户也可以自定义类加载器-好处:
- 3.双亲委派机制(重要)
- 4.沙箱安全机制
三级目录
这里想说
类装载子系统作用:
从文件系统中,加载class文件,只负责加载,不管执行。
有人问:写的java文件怎么就变成class文件了?
答:通过javac命令
类装载子系统包括:
loading-linking-initializetion三步
- loading
中需要知道有bootstrap-extension-application三种加载器
通过全类名,获取该类的二进制字节流=》方法区的数据结构在内存中生成类的class对象。 - linking
需要知道验证,准备,解析三步(感觉了解就行) - init
javac自动收集类中的所有类变量的赋值动作Clinnit
1.加载器有哪些“?
类加载器(重要)
bootstrap 引导类加载器,用c或c++,用于装载,java,javax,sun包下的文件。
其他加载器(重要)
extension拓展类加载器,和application系统类加载器统称为其他加载器。
一般我们自己写的类就是用application加载的,而jre,lib,ext子目录下的一些文件就是用拓展类加载的。
我们可以通过下面的方式获取系统类加载器,。getParent获取他的上层。
ClassLoader.getSystemClassLoader()
2.用户也可以自定义类加载器-好处:
- 隔离加载类
- 修改类加载方式
- 扩展加载源
- 防止源码泄漏
方法:extends classloader 重写findclass
3.双亲委派机制(重要)
- 如果一个类加载器收到加载请求,并不会自己先加载,而是去把这个请求委托给父类加载器去执行。
- 如果被委托的父类加载器,存在父类加载器,自会进一步向上委托,最总点,顶层的启动类加载器,
- 如果父类可以完成加载就让父类加载,如果不能加载,则子类加载。
双亲委派的优势: - 避免类的重复加载
- 保护程序安全,防止核心api被随意篡改,(例如自定义String类)
4.沙箱安全机制
- 保护自己的引导类加载的代码,不背自定义代码破坏
- 类名和用的加载器也一样,能被定义为一个类(就是一个类的类名,和加载它的加载器一样,就是一个类)
- jvm会保护用户类加载器的一个引导信息,到方法区,用于后续引用
类的主动使用和别动使用 :是否别初始化。
所以加粗的地方还是可以看看,八股文有点映像总是好的。