这是我参与8月更文挑战的第7天,活动详情查看: 8月更文挑战
JVM算是Java学习最核心的知识点了,也是面试中最多最复杂的考点。强烈推荐《深入理解Java虚拟机:JVM高级特性与最佳实践(第3版) 周志明》,这本书读了好几遍,每次都能有所收获。(可以使用微信阅读购买,上班摸🐟)
下面是我整理的一份导图,省略了一部分内容(如字节码技术、模块化系统、编译与优化),这部分内容繁杂,应该会在后续的文章中介绍。这份导图的源文件我已上传到github上,欢迎自取,原图地址为:JVM
为什么需要学习Java虚拟机
对于Java开发者来书,Java虚拟机是透明的,我们仅需要知道Java的核心类库和第三方API的用法,就可以专注于业务代码了。但是Java虚拟机又不是万能的,总有些意外情况需要我们自己去解决,比如:
- 程序需要一些性能优化,而JVM就提供了许多的配置参数,用于满足不同场景下的性能需求。
- Java程序员把控制内存的权力交给了Java虚拟机,一旦出现内存泄漏和溢出方面的问 题,如果不了解虚拟机是怎样使用内存的,那排查错误、修正问题将会成为一项异常艰难的工作。
所以还是让我们一起重温经典吧。整体来说,Java虚拟机的知识点很多,想要完全学完是很难的,但是了解些基本原理、调优参数及工具还是可以的。
Java是如何运行的
这是一个经典的面试题,也是JVM问题的开篇。执行过程如下:
大致过程就是,我们写好的.java文件(源文件)被编译器编译后变成.class文件(字节码),然后被JVM的类加载器加载到内存,解释器将字节码文件解释成计算机能够识别的机器指令交由操作系统去执行。而在Java虚拟机内部,在加载.class文件后会将其放在方法区中,在实际运行时,虚拟机会执行方法区内的代码。Java虚拟机同样会在内存中划分出堆和栈来存储运行时数据。
其实从这里也能看出来,为什么说Java是跨平台的,实现了它吹的牛“Write Once, Run Anywhere”。因为Java虚拟机的存在,屏蔽了操作系统层面的信息,使得Java程序只需要生成Java虚拟机运行的目标代码(字节码),就可以在多种平台上不加修改地运行。