JVM

60 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

JVM探究

面试热题

请谈谈你对JVM的理解? java8虚拟机和之前的变化更新?

  • 什么是OOM,什么是栈溢出StackOverFlowError? 怎么分析?
  • JVM的常用调优参数有哪些?
  • 内存快照如何抓取,怎么分析Dump文件?
  • 谈谈JVM中,类加载器你的认识

1、JVM的位置

image-20221013154938629

2、JVM的体系结构

image-20221013183002625

java文件到class文件的变化

百分之99的JVM调优都是在堆中调优,Java栈、本地方法栈、程序计数器是不会有垃圾存在的。

3、类加载器

作用:加载Class文件~

image-20221013185707298

图 类在经过Class Loader之后的变化

 1.虚拟机自带的加载器

 2.启动类(根)加载器(BOOT)

 3.扩展类加载器(EXC)  

4.应用程序加载器(APP)

 5.百度:双亲委派机制

4、双亲委派机制(重点)

 //双亲委派机制:安全  

// 1. APP–>EXC-->B0OT(最终执行)  

// B0OT  

// EXC  

// APP  三种加载器

1.类加载器收到类加载的请求  

2.将这个请求向上委托给父类加载器去完成,一 直向上委托,直到启动类加载器  

3.启动加载器检查是否能够加载当前这个类,能加载就结束, 使用当前的加载器,否则, 抛出异常,通知子加载器进行加载  

4.重复步骤3  

image-20221015093040962

当一个Hello.class这样的文件要被加载时。不考虑我们自定义类加载器,首先会在AppClassLoader中检查是否加载过,如果有那就无需再加载了。如果没有,那么会拿到父加载器,然后调用父加载器的loadClass方法。父类中同理也会先检查自己是否已经加载过,如果没有再往上。注意这个类似递归的过程,直到到达Bootstrap classLoader之前,都是在检查是否加载过,并不会选择自己去加载。直到BootstrapClassLoader,已经没有父加载器了,这时候开始考虑自己是否能加载了,如果自己无法加载,会下沉到子加载器去加载,一直到最底层,如果没有任何加载器能加载,就会抛出ClassNotFoundException。