本文已参与「新人创作礼」活动,一起开启掘金创作之路。
JVM探究
面试热题:
请谈谈你对JVM的理解? java8虚拟机和之前的变化更新?
- 什么是OOM,什么是栈溢出StackOverFlowError? 怎么分析?
- JVM的常用调优参数有哪些?
- 内存快照如何抓取,怎么分析Dump文件?
- 谈谈JVM中,类加载器你的认识
1、JVM的位置
2、JVM的体系结构
java文件到class文件的变化
百分之99的JVM调优都是在堆中调优,Java栈、本地方法栈、程序计数器是不会有垃圾存在的。
3、类加载器
作用:加载Class文件~
图 类在经过Class Loader之后的变化
1.虚拟机自带的加载器
2.启动类(根)加载器(BOOT)
3.扩展类加载器(EXC)
4.应用程序加载器(APP)
5.百度:双亲委派机制
4、双亲委派机制(重点)
//双亲委派机制:安全
// 1. APP–>EXC-->B0OT(最终执行)
// B0OT
// EXC
// APP 三种加载器
1.类加载器收到类加载的请求
2.将这个请求向上委托给父类加载器去完成,一 直向上委托,直到启动类加载器
3.启动加载器检查是否能够加载当前这个类,能加载就结束, 使用当前的加载器,否则, 抛出异常,通知子加载器进行加载
4.重复步骤3
当一个Hello.class这样的文件要被加载时。不考虑我们自定义类加载器,首先会在AppClassLoader中检查是否加载过,如果有那就无需再加载了。如果没有,那么会拿到父加载器,然后调用父加载器的loadClass方法。父类中同理也会先检查自己是否已经加载过,如果没有再往上。注意这个类似递归的过程,直到到达Bootstrap classLoader之前,都是在检查是否加载过,并不会选择自己去加载。直到BootstrapClassLoader,已经没有父加载器了,这时候开始考虑自己是否能加载了,如果自己无法加载,会下沉到子加载器去加载,一直到最底层,如果没有任何加载器能加载,就会抛出ClassNotFoundException。