1. 什么是JVM
定义:
Java Virtual Machine - java程序的运行环境(java二进制字节码的运行环境)。
好处:
- JVM是java程序一次编写,到处运行的基石。
- JVM屏蔽了java字节码与底层操作系统的差异,对外提供了一个一致的运行环境,JVM用解释的方法来执行二进制字节码,来达到代码的平台无关性。
- 自动内存管理,垃圾回收功能。
- java语言它的出现时期比较早,这个优点是相较于C、C++来说的,C、C++程序在编写的时候程序员要手动释放内存,如果操作不当很容易会造成内存泄漏问题,而JVM的垃圾回收功能就大大减轻了程序员们的负担,减少了程序员出错的机会,因此而受到大家的欢迎。
- 数组下标越界检查。
- 这里说明一下,C语言并没有数组下标越界检查,在C语言中如果出现数组下标越界,则会覆盖掉其他的代码内存,是很严重的;而在java程序中,如果出现数组下标越界会爆数组下标越界异常。当然,我们可以看出,前者更为严重,这也间接说明了JVM的优点。
- 多态
- 多态面向对象的基石,正是有了多态,才让我们的程序代码的可扩展性得到了巨大的提升,而JVM在内部使用虚方法表的形式实现了多态。
比较:
JVM JRE JDK
JVM是java虚拟机,由它去屏蔽java代码与底层操作系统的差异。
JRE(JVM+基础类库),基础类库是我们平时开发java代码时用的类,比如说集合类、线程类、日期类、IO类等等,java虚拟机只是一个运行环境,就相当于一个空壳,只有结合了基础类库才构成了一个完整意义上的运行时环境。(JRE:Java Runtime Environment,java运行时环境)
JDK(JVM+基础类库+编译工具),如果在JRE的基础上再加上一些编译开发工具,像javac、javap、一些内存监测工具等就构成了JDK(Java Development Kit,java开发工具包)。
2. 学习JVM有什么用?
- 面试
- 现在的java行业越来越卷,如果只是问一些简单的问题是不能让面试官区分出面试者的优劣,这个时候,就会问一些难一点的问题,而JVM就是这些这些难题之一。
- 理解底层的实现原理
- 比如说自动拆装箱、for-each增强实现机制、动态代理,这些都需要我们掌握一些字节码技术。
- 中高级程序员的必备技能
- 程序的很多问题都是与JVM有关的,掌握了JVM的知识和相关的工具之后就能够快速地定位分析并解决这些程序运行过程中的问题。
3. 常见的JVM
JVM是一套规范,只要遵从这套规范,自己甚至可以开发一套JVM的实现。最著名的就是oracle公司的HotSpot,现在学习和使用的也都是这个JVM。
4. 学习路线
JVM分为三大块,一个是类加载器(ClassLoader)这一块,还有一个是JVM的内存结构,第三块是它的一个执行引擎的部分。
一个类从java源代码编译为了二进制字节码以后必须经过类加载器才能被加载到JVM里去运行,类都是放在方法区部分,类将来创建的实例对象是放在堆的部分,而堆里面的这些对象在调用方法时又会用到虚拟机栈、程序计数器以及本地方法栈,方法执行时每行代码是由执行引擎中的解释器逐行进行一个执行的,方法里的一些热点代码(也就是被频繁调用的代码)会由即时编译器对热点代码进行一个优化之后的执行。执行引擎中还有一个很重要的模块:垃圾回收模块,它会对堆里面不再被引用的对象进行一个垃圾回收。还有一些java代码不方便实现的功能,必须调用底层操作系统的功能,就需要借助本地方法接口来调用操作系统提供的一些功能和方法。
学习顺序:
-
JVM的内存结构 -
垃圾回收机制(GC) -
类的字节码结构(java class),以及编译前的一些优化 -
类加载器 -
运行时优化的即时编译器
今天回了老家,回来时已经下午6点多了,所以今天也没有学习多少关于JVM
的知识,明天没有事情,一定多学点,不说了,还要去刷两道Leetcode
...(* ̄0 ̄)ノ
|