想了好久,还是决定写一个jvm的一个系列,学习java基础,我感觉必须要动要动一下jvm,不然不会知道去排查问题和优化代码,这篇文章大概就是写一个jvm的一个总体的概述。后续会写具体详细的章节来介绍jvm,因为最近自己也在学习jvm,希望与大家共同学习。
一、JVM概述
JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。(直接从百度百科拿了个概念),这里有兴趣的可以去了解下JVM,VMware,docker这些的区别,每个将的层次概念不一样。
话不多说,直接上图(用亿图软件画的,还比较好用,有兴趣的小伙伴可以试试):
从图上看,个人觉得jvm分为前端编译(javac)生成class文件,类加载系统,以及运行时数据区和执行引擎,后期大概会根据这个顺序进行学习,class文件大概知道其构成,以及其通过javac编译的过程,类加载的话这个挺重要的,我们可以知道一个字节码文件中的一些内容的检验,初始化等。运行时数据区(这里要区分java内存模型),大致可以分为共享区和线程私有区域,共享区域主要是堆和方法区(这里是java7的jvm,在java8中的方法区的实现是元数据区域(Metaspace)其实这个元数据区域不在java虚拟机内存结构里面,而是在本地内存中),线程私有的话主要有程序计数器,本地方法栈和虚拟机栈,在数据运行时区域中的堆中主要还会有对GC算法以及收集器的一个讲述。执行引擎的话包括解释运行和即时编译(JIT),后面还会说一些java工具,比如jps,jstack,jinfo,jstat,jmap等工具的使用,如何去分析。大体的JVM的一个学习路径就是如上图所示。后来我又去画了一个比较详细的图:
纯属个人学习画图,如果哪里有误,麻烦各位指正,不是做UI的感觉画的还是不够协调。后期会详细说:
1、class文件
2、类加载
3、运行时数据区(内存结构)
4、java自带的一些工具
5、GC算法和收集器
6、编译器
7、java内存模型
有兴趣的小伙伴可以一起学习jvm