最近看到不少吐槽虚拟机的小伙伴。
有2年的工作经验,每次面试都会被问一点JVM。
原来JVM这么拼啊!每次面试前都会背一点,但是每次面试官多问俩,就凉了…
虽说临阵磨枪、不快也光,但像上边两种情况的话,只是临时准备准备,就很容易被问住,所以还是要踏实学习一下。
那么,JVM都需要学习哪些知识呢?

整理了一个JVM的学习大纲,希望对大家的学习有所帮助。
下面对JVM的知识进行了简单整理。
Java虚拟机,外文名:Java Virtual Machine,简称JVM。它的实质是一种抽象化的计算机,是运行所有Java程序的抽象的计算机,是Java语言的运行环境。
Java语言的一个特点是:与平台的无关性。使用Java虚拟机可以体现这一特点。一般情况下,高级语言如果需要在不同的平台上运行,需要编译成不同的目标代码。在引入虚拟机之后,Java语言在不同平台上运行时,就不需要重新编译了。
JVM定义了控制Java代码解释执行和具体实现的五种规格,分别为JVM指令系统、JVM寄存器、JVM栈结构、JVM碎片回收堆、JVM存储区。
JVM是面试中常问题,也是一个较为基础的问题。JVM的内存结构,可以分为线程共有和线程私有两方面。线程共有包括Java堆和方法区,线程私有包括虚拟机栈、本地方法栈和程序计数器。
Java堆用以存放Java程序运行时新建的对象等数据。Java堆分为新生代和老年代,新生代细分还可分为Eden区和两个Survivor区。常说的垃圾回收(Garbage Collection,GC)就是对堆区的内容进行回收。
方法区中的类有类型信息、常量池、域信息、方法信息。方法区存储的信息,大都来自class文件,是Java运行的重要数据。
虚拟机栈和本地方法栈用于存放函数调用堆栈消息。虚拟机执行Java程序时,每个方法都会创建一个栈帧,栈帧存放在Java虚拟机栈中,通过压栈出栈的方式进行方法调用。
程序计数器用于存放下一条运行的指令,并且不会有内存溢出的情况。
上文中提到了垃圾回收,外文名Garbage Collection,简称GC。
GC根据堆内存的程度可以分为Minor GC、Major GC、和Full GC。
Minor GC发生的堆内存为年轻代,老年代的垃圾回收成为Major GC,Major GC通常与Full GC是等价的,收集整个GC堆。
垃圾回收部分会常被面试官问到的是垃圾回收算法。
垃圾回收算法主要由以下几种:
引用计数法:对于一个对象A,当A被引用了,A的引用计数器就被加1;引用失效时,引用计数器就减1。对象A的引用计数器的值为0时,对象A就不能被引用了。这也就使引用计数法存在一个缺点:无法解决互相引用问题。
标记—清除算法:分为两个阶段:标记阶段和清除阶段。在标记阶段,首先通过根节点,标记所有从根节点开始的可达对象,则未被标记的对象就是未被引用的垃圾对象。之后,在清除阶段,清除所有未被标记的对象。这种算法存在的一个缺点是空间碎片问题。
复制算法:是将原有的内存空间分为两块,每次只使用其中一块。在垃圾回收时,将正在使用的内存中的存活对象复制到未使用的内存块中。之后,清除正在使用的内存块中的所有对象,交换两个内存中的角色,完成垃圾回收。
标记—压缩算法:首先从根节点开始,对所有可达的对象做一次标记,但之后,它并不是简单的清理未标记的对象,而是将所有的存活对象压缩到内存空间的一端。之后,清理边界外所有的空间。
分代:将内存区域根据对象的特点分成不同的内存区域,根据每块区域对象的特征不同使用不同的回收算法,以提高垃圾回收的效率。
哪些可以作为GC的root对象?
1)被启动类加载的类和创建的对象;
2)栈内存中引用的对象;
3)方法区中静态和常量引用的对象;
4)本地方法中JNI引用的对象。还有相关的一些垃圾收集器、CMS、G1、并行、串行等的定义或特征。
垃圾收集器有独占式的串行收集器,也有加了多线程的并行收集器。选择一个合适的垃圾收集器主要参考的就是GC策略的指标。主要包括以下几个部分:
吞吐量:指在应用程序的生命周期内,应用程序所花费的时间和系统总运行时间的比值。
停顿时间:指垃圾收集器正在运行时,应用程序的暂停时间。对于独占收集器而言,停顿时间可能会比较长。使用并发的收集器时,由于垃圾收集器和应用程序交替运行,程序的停顿时间会变短,但是,由于其效率很可能不如独占垃圾回收器,故系统的吞吐量可能会较低。
垃圾回收频率:指垃圾回收器多长时间会运行一次。一般来说,对于固定的应用而言,垃圾回收器的频率应该是越低越好。
反应时间:指当一个对象被称为垃圾后多长时间内,它所占据的内存空间会被释放。
堆分配:不同的垃圾回收器对堆内存的分配方式可能是不同的。一个良好的垃圾收集器应该有一个合理的堆内存区间划分。
串行收集器主要有两个特点:第一:使用单线程进行垃圾回收;第二:独占式垃圾回收。并行收集器只是简单的把使用单线程进行垃圾回收改为多线程进行垃圾回收,它依旧是独占式垃圾回收。
CMS是Concurrent Mark Sweep的缩写,为并发标记清除。从名称上可以得知,它使用的是标记—清除算法,同时它又是一个使用多线程并发回收的垃圾收集器。
与CMS收集器相比,G1收集器是基于标记—压缩算法的。
CMS工作时,主要步骤有:初始标记、并发标记、重新标记、并发清除和并发重置。其中初始标记和重新标记是独占系统资源的,而并发标记、并发清除和并发重置是可以和用户线程一起执行的。因此,从整体上来说,CMS收集不是独占式的,它可以在应用程序运行过程中进行垃圾回收。
对标阿里架构师
分享到这里,需要获取更多资料可以扫码进群或关注我们的公众号。

Java虚拟机学习
最新推荐文章于 2025-02-10 17:07:11 发布

662

被折叠的 条评论
为什么被折叠?



