★引用计数收集器
这种方法中,堆中每个对象都有一个引用计数。当一个对象被创建了,并且指向该对象的引用被分配给一个变量,这个对象的引用计数被设置成1。当这个对象的引用赋值给其他任何一个变量的时候,这个变量就增加1。当该对象引用超过生存期或者被设置成一个新的值时,相应的计数变量就会减1。当引用计数为0的时候,这个对象就被当做垃圾收集。在收集的时候,该对象所引用的任何其他对象的计数值也相应的减少1。这种方法中,某个对象被垃圾收集后可能导致后续其他对象的垃圾收集行动。
好处:可以很快的执行,交织在程序的运行之中。对于实时环境很有利。
坏处:无法检测出循环(即两个或者更多的对象相互的引用)。for example:父对象有个对子对象的引用,子对象又反过来引用父对象。另外就是计数的的增加和减少会带来额外的开销。
★跟踪收集器
跟踪收集器追踪从根结点开始的对象引用图。在java虚拟机之垃圾收集(上)中也说到过,跟踪收集,以某种方式来标记。追踪算法被称作“标记并清除”。
1.在标记阶段,垃圾收集器遍历引用树,标记每个遇到的对象
2.在清除阶段,没有被标记的对象被释放,使用的内存被返回到正在执行的程序。在java虚拟机中,清除步骤必须包括对象的终结。
★压缩收集器
该收集器即压缩和拷贝,是标记并清除收集器通常使用的两种策略,也是java虚拟机垃圾收集器中对付堆碎块的策略。这两种方法都是快速的移动对象来减少堆碎块。
压缩收集器把活动的对象越过空闲区滑动到堆的一端,在这个过程中,堆的另一端出现大的连续空闲区。所有被移动的对象的引用也被更新,指向新的位置。被移动对象引用的更新可以间接实现比较简单。不直接引用堆中的对象,实际上指向一个对象句柄表。对象句柄才指向堆中对象的实际位置。对象移动的时候,只有这个句柄需要被更新成为新位置。所有的程序中对对象的引用仍然指向这个具有新值的句柄,句柄的本身没有移动。这种做法也会对象的每次访问带来性能的损失。
★拷贝收集器
拷贝收集器把所有的活动的对象移动到一个新的区域。在拷贝过程中,被紧挨着布置,这样可以消除原本它们在旧区域的空隙。即空闲区。
好处:对象可以在根对象开始的遍历过程中随着发现而拷贝,不再有标记和清除的区分。对象被快速拷贝到新区域,同时转向指针仍然留在原来的位置。转向指针可以让垃圾收集器发现已经被转移对象的引用。然后垃圾收集器可以把这些引用设置为转向指针的值,因此它们现在指向对象的新的位置。
一般的拷贝收集器算法被成为“停止并拷贝”。此方案中,堆被分成两个区域,任何时候都使用一个区域。对象在同一个区域中分配直到被耗尽。此时,程序执行被中止,堆被遍历,遍历时遇到活动的对象被拷贝到另个区域。当停止和拷贝过程结束时,程序恢复执行。依次往复,对于指定大小的堆来说需要两倍大小的内存,由于任何时候都只使用其中的一半,这就是该方法带来的代价。
★按代收集的收集器
针对停止并拷贝收集器的缺点的改进:
1.大多数程序创建的大小大部分对象都具有很短的生命期
2.大多数程序都创建一些具有非常长生命周期的对象
按代收集的收集器通过把对象按照寿命来分组。此方法中,堆被划分成两个或者更多的子堆,每个堆为一“代”对象服务。最年幼的那一代进行最频繁的垃圾收集。最年幼的对象在经历了好几次的收集后仍然存活,那么它就成长为寿命更高的一代,会被转移到另外一个子堆中去。即更高的年龄层去。
按代收集技术可以应用于拷贝算法,也可以应用于标记并清除算法。可以提高垃圾收集算法的性能。
★自适应收集器
自适应收集器主要是根据具体的情况和为了实现更好的目的,采用多种不同的算法来实现垃圾收集。即组合收集器,多种收集器技术的结合使用。
分享到:
相关推荐
Java 虚拟机学习笔记: Java 内存区域, 垃圾收集, 内存分配与回收策略, JVM 调优, 文件结构, 类加载机制, Java 程序 Java是一种面向对象的编程语言,由Sun Microsystems于1995年推出。它是一种跨平台的语言,...
总之,Java虚拟机的垃圾收集机制是其内存管理的核心,它自动化地处理了内存的分配和释放,为开发者提供了便利,同时也带来了性能和复杂性的挑战。理解垃圾收集的工作原理和各种算法对于优化Java应用程序的性能至关...
本篇文章将深入探讨Java虚拟机中的垃圾收集器(GC)及其对内存管理的影响。 1. 垃圾收集器的由来与作用 垃圾收集器的引入主要是为了解决内存管理的问题。在没有GC的情况下,程序员需要手动释放不再使用的对象,这...
### 学习笔记之Java虚拟机详解 #### 运行时数据区域概览 Java虚拟机(JVM)运行时数据区域主要包括以下几部分:程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区以及运行时常量池。 1. **程序计数器**: -...
JVM 不仅执行字节码,还负责垃圾收集、内存管理等任务,确保Java程序的高效运行。 与C++等编译型语言不同,Java 程序不直接生成操作系统可执行文件。Java 源代码先由javac编译器转化为字节码,然后由JVM 解释执行。...
### 深入Java虚拟机JVM类加载学习笔记 #### 一、Classloader机制解析 在Java虚拟机(JVM)中,类加载器(ClassLoader)是负责将类的`.class`文件加载到内存中的重要组件。理解类加载器的工作原理对于深入掌握JVM以及...
**JVM学习笔记(Java虚拟机)** Java虚拟机(JVM)是Java语言的核心组成部分,它是Java程序运行的平台,负责解释和执行字节码。深入理解JVM对于优化Java应用程序性能至关重要。本笔记将从以下几个方面详细介绍JVM:...
7. **动态语言支持**:JDK 7引入了 invokedynamic 指令,这是Java虚拟机的四大基础操作之一,用于支持动态类型语言的实现,如Groovy和JRuby。 8. **异常链**:JDK 7允许在捕获异常时保留原始异常信息,形成异常链,...
2. 垃圾回收器:Java虚拟机(JVM)包含一个或多个垃圾回收器,它们负责监测和回收不再使用的对象所占的内存。 二、垃圾回收的工作原理 1. 引用计数法:早期的垃圾收集算法,通过计算对象的引用次数来判断是否需要...
《JVM:深入理解Java虚拟机》是一本深入解析Java虚拟机工作原理和技术细节的经典书籍。这份学习笔记将涵盖JVM的关键概念、架构以及它如何影响Java程序的性能。我们将探讨以下几个方面: 1. **JVM概述** Java虚拟机...
8. **JVM原理**:简要介绍Java虚拟机的工作原理,包括内存模型、类加载机制、垃圾收集器和调优策略。 9. **网络编程**:涉及Socket编程,讲解如何建立客户端和服务端通信,以及套接字和服务器套接字的使用。 10. *...
《深入理解Java虚拟机》是Java开发者们深入探讨Java运行机制的经典之作,作者周志明以其深入浅出的讲解方式,揭示了Java虚拟机(JVM)的工作原理。本资源包含该书第三版的源码分析及学习笔记,旨在帮助读者更透彻地...
Java虚拟机(JVM)是Java程序运行的核心,它是一个抽象的计算机系统,负责执行Java字节码。在深入理解JVM之前,我们先要明白什么是字节码:Java源代码经过编译后生成的中间表示,即.class文件,里面包含的就是字节码...
本文主要关注的是Java虚拟机(JVM),它是实现Java语言跨平台特性的关键。JVM定义了Java程序运行所需的一套指令集和一个相应的运行时环境。它能够将Java源代码编译成与平台无关的字节码,然后在不同的操作系统上通过...
Java学习笔记源码MD.rar是一个压缩包,其中包含了一系列关于Java编程语言的学习资料,特别是针对JVM(Java虚拟机),Spring框架以及Java多线程等内容的深入探讨。这些主题是Java开发中的核心部分,对于任何想要提升...
### Java私塾学习笔记整理 #### 第一章:Java入门 **一、Java是什么?** Java是一种广泛使用的高级编程语言,由Sun Microsystems于1995年推出。它旨在为跨平台开发提供一种通用的语言环境,使开发者能够在任何...
15. **垃圾收集与内存管理**:理解Java内存模型,了解如何避免内存泄漏,以及垃圾收集的工作原理。 16. **设计模式**:可能包含常见的23种设计模式,如单例,工厂,观察者,装饰器,适配器等模式的应用场景和实现。...