目录
1. 什么是JVM
JVM是用于运行Java字节码的虚拟机,包括一套字节码指令集,一组程序寄存器,一个虚拟机栈,一个虚拟机堆,一个方法区和一个垃圾回收器。Java运行在操作系统上,不与硬件设备直接交互。
Java程序的具体运行过程如下:
1)Java源文件被编译器编译成字节码文件
2)JVM将字节码文件编译成相应操作系统的机器码
3)机器码调用相应操作系统的本地方法库执行相应方法
2. JVM 的内存区域
Java的内存区域分为线程私有、线程共享和直接内存,其中方法区和Java堆为线程共享区域,本地方法区、程序计数器和虚拟机栈为线程私有区域。
线程私有区域的生命周期与县城相同,随线程的启动而创建,随线程的结束而销毁。在JVM内部每个线程都与操作系统的本地线程直接映射,
线程共享区域随虚拟机的启动而创建,随虚拟机的关闭而销毁。
直接内存也叫做堆外内存,它并不是JVM运行时数据区的一部分,但在并发编程中被频繁使用。
程序计数器:用于存储当前运行线程所执行的字节码行号指示器。如果该方法执行的是native方法,则程序计数器的值为空
虚拟机栈:方法执行过程的内存模型,在当前栈帧中存储了局部变量表、操作数栈、动态链接和方法出口等信息。每个栈由多个栈帧组成,对应每次方法调用时所占的内存,每个线程只有一个活动栈帧,对应当前正在执行的方法。
虚拟机堆:存储数组和所有创建的对象,是垃圾回收的内存区域
方法区:存储常量、静态变量、类信息、运行时常量池等数据
3. 栈溢出和堆溢出
栈溢出:递归没有出口可能引发栈溢出
public class Demo01{
private int count;
public static void method(){
count++;
method();
}
public static void main(String[] args){
try{
method();
}catch(Throwable e){
e.printStackTrace();
System.out.println(count);
}
}
}
堆溢出:持续创建对象可能造成堆溢出
String str = new String("abc");
for(int i = 0;i < 100000000; i++){
str += str;
}
4. JVM 的类加载机制
双亲委派机制:
JVM在类加载过程中默认采用双亲委派机制。双亲委派机制指当一个类发出了类加载请求时,首先将该请求委托给其父类,依次递归,如果父类能够完成该类加载任务,就成功返回,如果不能完成,则交由其子类完成类加载任务。
双亲委派机制的优点是保证了类的唯一性和安全性。
5. 垃圾回收算法
(1)复制算法
(2)标记清除算法
(3)标记整理算法
(4)分代垃圾回收
6. 垃圾回收器
新生代垃圾回收器:
(1)serial:单线程垃圾回收器,复制算法
(2)parNew:多线程垃圾回收器,serial的多线程版本,复制算法
(3)parallel scavenge:多线程垃圾回收器,parallel scavenge 的目标是达到一个可控制的吞吐量,复制算法
老年代垃圾回收器:
(1)serial old:serial的老年代版本,标记整理算法
(2)parallel old:parallel scavenge的老年代版本,标记整理算法
(3)CMS:CMS 收集器是一种以最短回收停顿时间为目标的收集器,标记清除算法。
分为四个步骤:
1)初始标记(STW) 2)并发标记 3)重新标记 (STW) 4)并发清理
G1(暂不整理)
参考文献:
offer来了-Java面试核心知识点精讲原理篇 中国工信出版集团