JVM探究
- 谈谈你对JVM的理解?java8虚拟机和之前的变化更新?
- 什么是OOM,什么是栈溢出StackOverFlowError?怎么分析?
- jvm的常用调优参数有哪些?
- 内存快照如何抓取,怎么分析Dump文件?知道吗?
- 谈谈JVM中,类加载器你的认识?
1.JVM的位置
java虚拟机是在操作系统之上,屏蔽了具体平台的相关信息,使得java语言编译程序只需要生成在java虚拟机上运行的字节码代码,就可以在不同平台上运行。
一次编译,到处运行(平台无关性)
![](https://i-blog.csdnimg.cn/blog_migrate/dd3e1d789395b7b14a0c710f62b105ce.png)
![](https://i-blog.csdnimg.cn/blog_migrate/4fff3c3d9a85a5796aac13f7ece4e681.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/d8ee6a23645121a94e5fa98793a42c3f.jpeg)
2.JVM的体系结构
类加载器将字节码文件装载到内存中,生成Class对象(加载,链接,初始化)
![](https://i-blog.csdnimg.cn/blog_migrate/09a921fdbd22a30d1b69aa0031069535.jpeg)
3.类加载器
作用:加载Class文件
![](https://i-blog.csdnimg.cn/blog_migrate/2ae4776ce579b783f84a125c710de451.png)
类的生命周期
加载、验证、准备、解析、初始化、使用、卸载
![](https://i-blog.csdnimg.cn/blog_migrate/7c1ce5111d3f74a7a5c26df3854df294.png)
JVM类加载机制
JVM类加载机制分为五部分:加载,验证,准备,解析,初始化
- 加载:这个阶段会在内存中生成一个代表这个类的 java.lang.Class 对象,作为方法区这个类的各种数据的入口。
可以从Class文件中获取,也可以从zip文件中去读(jar和war),也可以运行时计算生成(动态代理)等等 - 验证:确保Class 文件的字节流中包含的信息是否符合当前虚拟机的要求,并且不会危害虚拟机自身的安全
- 准备:正式为类变量分配内存并设置类变量的初始值阶段(常量赋值为指定值,静态变量赋值为默认值),即在方法区中分配这些变量所使用的内存空间。
- 解析:虚拟机将常量池中的符号引用替换为直接引用的过程
- 初始化:执行类构造器方法的过程。方法是由编译器自动收集类中的类变量的赋值操作和静态语句块中的语句合并而成的。如果一个类中没有对静态变量赋值也没有静态语句块,那么编译器可以不为这个类生成()方法
以下几种情况不会执行类初始化:
- 通过子类引用父类的静态字段,只会触发父类的初始化,而不会触发子类的初始化。
- 定义对象数组,不会触发该类的初始化。
- 常量在编译期间会存入调用类的常量池中,本质上并没有直接引用定义常量的类,不会触发定义常量所在的类。
- 通过类名获取 Class 对象,不会触发类的初始化。
- 通过 Class.forName 加载指定类时,如果指定参数 initialize 为 false 时,也不会触发类初始化,其实这个参数是告诉虚拟机,是否要对类进行初始化。
- 通过 ClassLoader 默认的 loadClass 方法,也不会触发初始化动作。
作用:
- 虚拟机自带加载器
- 启动类(根)加载器 (Bootstrap ClassLoader) JAVA_HOME\lib\rt.jar
- 扩展类加载器
(ExtClassLoader) J