1.入门部分
1.1为什么要学习JVM?
第一:为了面试。(企业招聘战略在升级,业务和技术位的越来越深)
第二:为了更好的理解JAVA,
第三:为了更好的解决线上为题
1)实现线上软件升级。(热替换)
2)更好的方式内存泄露,提高内存的有效使用率。
3)更好的提高系统的吞吐量
1.2你了解那些JVM产品?
Oracle公司的HotSpot。
IBM公司的J9。
阿里公司的TaobaoVM。
1.3JVM的构成有哪几个部分?
第一:类加载子系统(负责将类读取到内存,效验类的合法性,对类进行初始化)
第二:运行时数据区(负责存储类信息,对象信息,执行逻辑)
第三:执行引擎(负责从指定地址对应的内存中数据让后解释执行以及GC操作)
第四:本地库接口(负责实现JAVA语言与其他编程语言之间的协同)
2.类加载部分
2.1你知道那些类加载器吗?
第一:BootStrapClassLoader
第二:ExtClassLoader
第三:AppClassLoader
第四:自定义 ClassLoader
2.2为什么需要多个类加载器?
每个类加载器都有自己的加载职责,负责从不同的位置加载我们所需要的类,同时可以在基于需求进行懒加载(按需加载)列如:
1)加载基础类库(核心类库)
2)扩展类库
3)三方类(MyBatis,Spring,...)。
4)自己的类。
2.3什么是双亲委派类加载模型?
所谓双亲委派模型可以简单理解为向上询问、向下委托。当我们的类在被加载时,首先会询 问类加载器对象的 parent 对象(两者之间不是继承关系),是否已经加载过此类,假如当前 parent 没有加载过此类,则会继续向上询问它的 parent,依次递归。如果当前父加载器可 以完成类加载则直接加载,假如不可以则委托给下一层类加载器去加载(可以理解为逐层分 配任务)。
2.4双亲委派方式加载类有什么优势,劣势?
通过双亲委派类加载机制,保证同一个类只能被加载一次,同时也是对类资源的一种保护。 例 如 我 们 自 己 也 写 了 一 个 java.lang.Object 类 , 为 了 保 证 Java 官 方 的 java.lang.Object 类加载后不再加载我们的 Object 就可以使用双亲委派机制。但是这里 也有一个缺陷,例如我们同一个 JVM 下有多个项目,但是不同项目中有包名类名都相同的 类(类中的内容是不同的),此时只能有一个项目中的类会被加载,其它项目则无法加载。还 有这种双亲委派模型可能会因为向上询问和向下委托,多少会影响一些性能。