在我们面试中经常会遇到面试官问一些有关JVM的问题,下面我大概从运行时数据域、类加载机制、类加载器、垃圾收集器、垃圾收集算法、JVM堆内存模型、JVM内存结构、JVM调优等几个方面来讲一下JVM。
一、运行时数据区域
在执行Java程序的时候,JAVA虚拟机会将自己所管理的内存划分为若干个不同的数据区域,每个区域分工不同,这些区域统称为“运行时数据区域”。下面来根据一张图来看一下这几个区域。
1、程序计数器
1>较小的内存空间。
2>当前线程字节码的行号指示器。
3>改变计数器的值来选取下一条需要执行的字节码指令。
4>一个处理器只会执行一条线程中的指令,为了线程切换后能恢复到正确的执行位置,每个线程一个计数器。
2、Java虚拟机栈
1>线程私有。
2>生命周期与线程相同。
3>每个方法执行都会创建栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等信息。
3、本地方法栈
1>线程私有。
2>使用到的本地(Native)方法服务。
4、Java堆
1>内存中最大的一块。
2>线程共享。
3>堆满了抛出OutOfMemoryError异常。
5、方法区
1>线程共享。
2>用于存储已被虚拟机加载的类型信息、常量、静态变量、及时编译器编译后的代码缓存等数据。
6、运行时常量池(次区域在方法区内部)
1>运行时常量池是方法区的一部分。
2>存放各种字面量与符号引用。
二、垃圾收集算法
1、标记-清除算法
首先标记出所有需要回收的对象,在标记完成后,统一回收掉所有被标记的对象。如图。
2、标记-复制算法
将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活的对象复制到另一块上面,然后再把已使用过的内存空间一次清理掉。如图。
3、标记-整理算法
标记-整理算法就是标记-清除算法后再将存活对象整理到一起,从而腾出来更大的连续空间。如图。
三、垃圾收集器
1、Serial收集器
Serial收集器是最基础、历史最悠久的收集器,这个收集器是一个单线程工作的收集器。
2、ParNew收集器
ParNew收集器实质上是Serial收集器的多线程并行版本,可以同时使用多条线程进行垃圾收集。
3、Parallel Scavenge 收集器
Parallel Scavenge收集器是一款新生代收集器,它是基于标记-复制算法实现的收集器。Parallel Scavenge收集器的目标则是达到一个可控制的吞吐量,所谓吞吐量就是处理器用于运行用户代码的时间与处理器总消耗时间的比值,即。
4、Serial Old收集器
Serial Old是Serial收集器的老年代版本,它同样是一个单线程收集器。
5、Parallel Old收集器
Parallel Old收集器是Parallel Scavenge收集器的老年代版本,支持多线程并行收集,基于标记-整理算法实现。
6、CMS收集器