JVM 概述
# JVM 概述
# 为什么要学习
在不少程序员的观念里,Java 虚拟机是透明的。在大家看来,我们仅需知道 Java 核心类库,以及第三方类库里 API 的用法,便可以专注于实现具体业务,并且依赖 Java 虚拟机自动执行乃至优化我们的应用程序。那么,我们还需要了解 Java 虚拟机吗?
答案是非常有必要的。如果我们把核心类库的 API 比做数学公式的话,那么 Java 虚拟机的知识就好比公式的推导过程。掌握数学公式固然可以应付考试,但是了解背后的推导过程更加有助于记忆和理解。并且,在遇到那些没法套公式的情况下,我们也能知道如何解决。
# 如何学习
如上从 JVM 架构图可知,JVM 由类加载器、运行时数据区、执行引擎组成。所以学习要点如下:
类加载:负责从文件系统加载到 class 信息,加载的类信息存放入方法区。
运行期数据区:包括方法区、堆、Java 栈、程序计数寄存器。
方法区:存放磁盘加载进来的类字节码。而程序中的创建的类实例存放在堆中。
堆:Java 堆在虚拟机启动时建立,每个 JVM 实例唯一对应一个堆。所有的 java 对象都实例都存放在堆里,并由用用所有的线程共享。
堆栈:Java 中所有的对象内存空间在堆中分配。但对象的引用在堆栈中分配。即:堆栈中分配的内存只是一个指向这个堆对象的引用。
Java 栈:每个 java 线程独有的 Java 栈。随着线程创建而被创建,保存帧的信息。
每当创建一个新的线程时,JVM 会为这个线程创建一个 Java 栈,同时会为这个线程分配一个 PC 寄存器,并且这个 PC 寄存器会指向这个线程的第一行可执行代码。每当调用一个新方法时会在这个栈上创建一个新的栈帧数据结构,这个栈帧会保留这个方法的一些元信息,如在这个方法中定义的局部变量、一些用来支持常量池的解析、正常方法返回及异常处理机制等。
寄存器:记录下一个可执行的方法。线程独有。
执行引擎:把 class 文件变成本地代码执行。包含三部分:解释器,JIT 及时编译器,垃圾回收器
根据要点整理脑图如下:
TODO doing