my git : https://github.com/hejiawang
Java虚拟机学习
整理整理今天工作之余学习的成果——几种垃圾收集算法的思想
一、标记——清除算法
标记——清除算法是最简单基础的垃圾收集算法,什么意思呢:就是标记、清除两步走,首先标记出所有需要回收的已经死了没人用的垃圾对象,在标记完成后,统一回收所有被标记的对象。
这个算法的优点是相当简单,下面看看这个算法的不足:
1、效率不高,标记和清除这两个步骤的效率都不高,
2、空间问题。标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致以后在程序运行过程中需要分配较大对象时,无法找到足够的连续内存而不得不提前触发另一次垃圾收集操作。
附上一张标记——清除算法的示例图,浅显易懂。。。。
二、复制算法
之前说过,上面那个标记——清除算法效率不靠谱,然后复制算法诞生了。。。
复制算法就是将可用内存按容量划分为大小相等的两块,每次只使用其中的一块,当这一块的内存用完了,就将还活着的对象复制到另外一块上面,然后再把已使用过得这块内存一次清理掉,成为没有对象的内存,这样反反复复。。。。。这就是复制算法的思想了。
这个算法肯定是比标记——清除算法好了,解决标记——清除算法的不足,然后效率也还可以,就是付出的代价也有点太高了,将每次可用内存变成了总共内存的一半,不值啊也。。。
一样,附上复制算法的解释说明图:
三、标记——整理算法
为了节省点内存空间,又要解决标记——清除算法内存片段的问题,标记——整理算法从天而降。。。
这种算法的思想就是优化了一下标记——清除算法,也是先对死了的对象进行标记,然后不是直接清除对象,而是让所有存活的对象都向一端活动,然后直接清除端边界以外的内存,示意图如下:
四、分代收集算法
当前商业虚拟机的垃圾收集都采用这种分代收集算法,这个算法的思想就是根据java对象存活周期不同,将内存划分为几块。一般,把Java堆分为新生代和老年代,这样就可以根据各个年代的对象特点采用最适当的收集算法了,在新生代中,每次垃圾收集时都会有大批对象死去,只有少量存活,那就用复制算法,只需付出少量存活对象的复制成本就可以完成收集;而老年代中,因为对象存活率高、没有额外空间对他进行分配担保,就要使用“标记——清理”或者“标记——整理”算法来进行回收了。
这个算法思想并没有什么新东西,这是将上面三种算法根据各自的特点,混合使用而已。
相关推荐
当前商业虚拟机的垃圾收集都是采用“分代收集”(Generational Collecting)算法,这种算法并没有什么新的思想出现,只是根据对象不同的存活周期将内存划分为几块。一般是把Java堆分作新生代和老年代,这样就可以...
在java中可以作为GC Roots的对象有以下几种:虚拟机栈中引用的对象、方法区类静态属性引用的对象、方法区常量池引用的对象、本地方法栈JNI引用的对象。 在java中,判定一个对象是否可以被回收需要经历两次标记。...
分代收集算法是Java虚拟机中最常使用的垃圾回收算法之一。它基于这样一个观察结果:绝大多数对象都是朝生夕死的,而存活较长时间的对象则可能会长期存活。基于这一特性,Java虚拟机将内存划分为几个不同的区域: - ...
- **概念**: 相比引用计数算法,可达性分析算法更加高效且广泛应用于现代垃圾收集器中。 - **工作原理**: 该算法通过追踪从一组根对象开始的所有引用链来确定对象的可达性。若对象不可达,则被认定为垃圾。 - **根...
1. **垃圾收集算法的核心思想**: 垃圾收集算法主要是通过追踪内存中的对象,判断哪些对象被引用(存活),哪些对象没有被引用(垃圾)。如果一个对象没有被任何引用指向,那么这个对象就会被视为垃圾,可以被回收...
引用计数是一种较为古老的垃圾回收算法,它的基本思想是为每个对象维护一个引用计数器,每当有一个地方引用它,计数器就加1;当引用失效时,计数器减1。当计数器的值为0时,表示该对象不再被任何地方引用,可以被...
虽然Java语言规范并未指定具体的垃圾回收算法,但常见的算法大致可以分为以下几种: 1. **引用计数法 (Reference Counting Collector)** - **原理**:为堆中的每个对象维护一个引用计数器,每增加一个引用,...
5. **JVM**:Java虚拟机的理解和优化是高级面试的热点,包括类加载机制、内存模型(堆、栈、方法区等)、垃圾收集算法(如分代收集、G1收集器)、性能调优等。 6. **设计模式**:23种设计模式是软件开发中的经典...
JAVA 程序的运行机制可以分为两种核心机制:JAVA 虚拟机和垃圾收集处理机制。JAVA 虚拟机实现了 JAVA 语言的平台无关性;垃圾收集处理机制实现了 JAVA 语言的健壮性。 JAVA 程序的运行过程可以分为以下几个步骤:...
- Java和C++都是面向对象的编程语言,但Java具有自动内存管理(垃圾收集)和跨平台(一次编写,到处运行)特性。 - 有C++语言基础的学习者,可以利用已有的知识快速上手Java。 6. 计算机程序设计: - 程序设计...
根据给定文件的信息,我们可以提炼出以下几个关键知识点: ### 一、Java 语言简介 Java 是一种面向对象的编程语言,由 Sun Microsystems 公司在 1995 年推出。它以其“一次编写,到处运行”的特性而闻名,这得益于...
JAVA面试题集合基础知识 本资源是面向 Java 开发者的面试题集,涵盖了 Java 基础知识中的多个方面,包括异常处理机制...finalize 是方法名,Java 技术允许使用 finalize() 方法在垃圾收集器清除对象之前执行一些操作。
创建线程的几种方式与 Thread 和 Runnable 接口的区别 - **创建线程的方式**: - **继承 Thread 类**:自定义一个类继承 Thread 类,并重写 run 方法。 - **实现 Runnable 接口**:自定义一个类实现 Runnable ...
Java的自动内存管理机制是其一大亮点,尤其体现在垃圾收集(Garbage Collection, GC)方面。GC能够自动地识别不再使用的对象,并释放其占用的内存空间,从而避免了手动管理内存所带来的潜在问题。本文将深入探讨Java...
- 垃圾收集通过不同的算法清理不再使用的对象。 - 新生代和老年代分别采用不同的回收策略。 51. **二叉树深度与广度遍历** - 深度优先遍历包括前序、中序和后序遍历。 - 广度优先遍历按照层次顺序访问节点。 ...
#### 操作系统IO的几种类型和原理 1. **阻塞I/O**:调用read或write后,当前线程会一直等待直到操作完成。 2. **非阻塞I/O**:调用read或write后,如果数据没有准备好则立即返回,不会阻塞。 3. **I/O多路复用**:...
- **线程池的几种实现方式**:FixedThreadPool、CachedThreadPool等。 - **线程的生命周期**:NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED。 **1.4 锁机制** - **说说线程安全问题**:在多线程...
- **垃圾收集**:自动释放不再使用的对象所占用的内存空间。 #### 1.8 什么是 JRE (或 J2RE)? **JRE (Java Runtime Environment)** 包括 JVM 和执行 Java 程序所需的基本类库。它是运行 Java 程序的基础环境,...