赞
踩
声明:本文章内容部分摘自于《Offer来了:Java 面试核心知识点精讲(原理篇)》
JVM(Java Virtual Machine)即 Java 虚拟机。JVM 的作用是运行 Java 字节码。JVM 运行在操作系统之上,JVM 会对不同的操作系统(例:Linux、Window、MacOS)做适配,这样我们开发 Java 代码的时候就无需关注各个底层操作系统的差异性,这也就是我们常说的 Java 伟大的跨平台特性。
JVM 的生命周期和 Java 进程一致。也就是说,JVM 随着 Java 进程的开始而开始实例化,随着 Java 进程的退出或关闭而实例消亡。
Java 程序的运行过程如下:
JVM 包括一个类加载器子系统、运行时数据区、执行引擎和本地接口库。本地接口库通过调用本地方法库与操作系统交互。它们各自的作用如下:
Java 采用可达性分析法和引用记数法来确定对象是否应该被回收。
在 Java 中如果要操作对象就必须先获得该对象的引用,因此可以通过引用记数法来判定一个对象是否可以被回收。在为对象添加一个引用时,引用计数 +1;在为对象删除一个引用时,引用计数 -1;如果一个对象的引用计数为 0,则表示此刻该对象没有被引用,是可以被回收的。
该方法的缺点是:有循环引用问题。循环引用即两个对象互相引用,导致它们的引用一直存在,无法被回收。
为了解决引用记数法的循环引用问题,Java 还采用了可达性分析法来判断对象是否可以被回收。具体做法是首先定义一些 GCRoots 对象,以 GCRoots 为起点向下搜索。如果从 GCRoots 到对象之间没有可达路径,那么说明该对象是不可达的。不可达对象要经过至少两次标记才能判定其是否可以被回收,如果在两次标记后该对象仍然是不可达的,那么该对象将被垃圾收集器回收。
Java 中常用的垃圾回收算法有:标记清除、复制、标记整理、分代收集这 4 种垃圾回收算法。
标记清除算法是基础的垃圾回收算法。该算法过程分为两部分:标记和清除。首先在标记阶段标记出所有需要回收的对象,然后在清除阶段清除可回收的对象并释放其所占用的内存空间。
缺点:如果内存中可被回收的小对象居多,则会引起内存碎片化的问题,继而引起大对象无法获得连续可用空间的问题。
为了解决标记清除法带来的内存碎片化问题,JVM 引入了复制算法。复制算法首先将内存划分为两块大小相等的内存区域,即区域1和区域2。新生成的对象都放在区域1中,区域1满后会对区域1进行1次标记,并将标记后存活的对象全部复制到区域2中,这时区域1内将不存在任何存活的对象,直接清理整个区域1即可。
优点:内存清理效率高且易于实现。
缺点:同一时刻只有一个内存区域可用,内存空间被压缩到原来的一半,因此存在大量的内存浪费。同时,在系统中有大量长时间存活的对象时,这些对象将在区域1和区域2之间来回复制而影响系统的运行效率。因此,该算法只在对象为『朝生夕死』状态时运行效率较高。
标记整理算法结合了标记清除算法和复制算法的优点。该算法过程分为两部分:标记和整理。首先在标记阶段标记出所有需要回收的对象,然后将存活的对象移动到内存的另一端,然后清除该端的对象并释放内存。
Java 对象有不同的类型,例如:长生命周期、短生命周期、大对象、小对象等。JVM 针对不同的对象类型采用不同的垃圾回收算法,这被称之为是分代收集算法。
分代收集算法根据对象的不同类型将内存划分为不同的区域,JVM 将堆划分为新生代和老年代。由于不同区域有不同的对象特性,因此JVM 根据不同的区域选择了不同的垃圾回收算法。
JVM 针对新生代和老年代提供了多种不同的垃圾收集器。针对新生代的垃圾收集器有:Serial、ParNew、Parallel Scavenge;针对老年代的垃圾收集器有:CMS、Serial Old、Parallel Old;还有针对不同区域的 G1 分区收集算法。
JVM 的类加载分五个阶段:加载、连接、初始化、使用、卸载。
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。