在过去一年里,自己几乎没有关注过Java技术方面,最近想看看,不要让自己落伍了!在Google查询了一下,关于垃圾收集机制的文章,综合了一下,如下:
1.标记-清除收集器
这种收集器首先遍历对象图并标记可到达的对象,然后扫描堆栈以寻找未标记对象并释放它们的内存。这种收集器一般使用单线程工作并停止其他操作。
2.标记-压缩收集器
有时也叫标记-清除-压缩收集器,与标记-清除收集器有相同的标记阶段。在第二阶段,则把标记对象复制到堆栈的新域中以便压缩堆栈。这种收集器也停止其他操作。
3.复制收集器
这种收集器将堆栈分为两个域,常称为半空间。每次仅使用一半的空间,jvm生成的新对象则放在另一半空间中。gc运行时,它把可到达对象复制到另一半空间,从而压缩了堆栈。这种方法适用于短生存期的对象,持续复制长生存期的对象则导致效率降低。
4.增量收集器
增量收集器把堆栈分为多个域,每次仅从一个域收集垃圾。这会造成较小的应用程序中断。
5.分代收集器
这种收集器把堆栈分为两个或多个域,用以存放不同寿命的对象。jvm生成的新对象一般放在其中的某个域中。过一段时间,继续存在的对象将获得使用期并转入更长寿命的域中。分代收集器对不同的域使用不同的算法以优化性能。
6.并发收集器
并发收集器与应用程序同时运行。这些收集器在某点上(比如压缩时)一般都不得不停止其他操作以完成特定的任务,但是因为其他应用程序可进行其他的后台操作,所以中断其他处理的实际时间大大降低。
7.并行收集器
并行收集器使用某种传统的算法并使用多线程并行的执行它们的工作。在多cpu机器上使用多线程技术可以显著的提高java应用程序的可扩展性。
8.G1垃圾回收器
“G1垃圾回收”的英文全称是 Garbage-First Garbage Collector (又被称作G1 GC),这是一个新型的垃圾回收器,由JDK 7中的Java HotSpot VM 引入。这个技术曾经在Java SE 6 Update 14版本中出现过一个试验性的,然后 G1 被 HotSpot的 反应快速(low-latency)的 Concurrent Mark-Sweep GC (简称 CMS)长期取代。
属性
G1 是一个“服务器风格(server-style)”的垃圾回收器,它主要有下面的这些属性:
◆并行和并发。 G1 可以从今天最新的硬件中获得并行的能力。它能够使用所有可用的CPU(CPU多核,硬件多线程,等)来加速它的 “stop-the-world” 机制(这个机制简称STW,即,在执行垃圾收集算法时,Java应用程序的其他所有除了垃圾收集帮助器线程之外的线程都被挂起)。
◆分代处理。 就像其它的HotSpot 垃圾回收器,G1 是分代的,也就是说,它在处理新分配的对象(年轻代)和已经生存了一段时间的对象(年老代)时会不同,它会更多地考虑一些新创建的对象实例,因为越新创建的就越有最大的可能性被回收,老对象只是偶尔访问一下。对于大多数的Java应用来说,这个机制可以极大地提高回收效率。
◆紧凑内存(碎片整理)。 不像CMS,G1 会对堆进行内存整理。压缩可以消除潜在的内存碎片的问题,这样程序就可以更长时间的平滑运行。
◆预见性的。 G1 比起 CMS 来有更多的预见性。这个主要还是用来消除内存碎片的问题。内存的碎片少了,Stop-the-World的暂停时间也会被减少。
描述
比起其它的HotSpot 垃圾回收器来说,G1 使用了一种非常不同寻常的方法来管理堆内存的布局。在G1中,在对象新生代和老一代上没有在物理上把他们分隔开来。取而代之的是,它把一个连续的堆内存拆分成了几个相同大小的区域。新产生的对象和老的对象都会被放在一系列可能不会连续的区域中。之所以这样做,就是为了让G1可以更灵活地移动老对象所占用的资源给新的对象。
G1中的内存收集会发生 “疏散暂停”,当内存从一系例区域开始回收时,这些区域所引用的 collection set 会被疏散到另一些区域中,这样,我们会有一整块的内存来重新被申请。疏散会发生整个程序的暂停,但“疏散”这些内存可以被并行运行,当然,你要有多核或多线程技术来支持。绝大多数的“疏散暂停”会去收集那些可用的比较新的内存区域,因此,这和其它的 HotSpot 垃圾回收器是相同的。偶而才会去查看一下老区域中的内存是否可以回收。
在 CMS中,其周期性的执行一个 concurrent marking phase。 这个phase中最主要的事情是,识别哪些老的区域中充满了可以回收的对象,因为这是最有效率和最合适的回收。但在G1中,G1不会执行那个所谓的 concurrent sweeping phase, 取而代之的是,去识别那些的最合适的老的区域是在并发的“疏散暂停”中进行的(后面会做介绍)。
使用 G1
G1 目前仍然还在试验阶段,使用下面两个参数可以打开G1机制:
-XX:+UnlockExperimentalVMOptions -XX:+UseG1GC
下面是设置垃圾回收器的暂停时间:
-XX:MaxGCPauseMillis =50 (设置暂停时间为 50ms)
在G1中,你还可以给垃圾回收器的暂停设置一个时间间隔:
-XX:GCPauseIntervalMillis =200 (设置暂停时间间隔 200ms)
注意,上面的两个参数只是代表目标,回收器并不保证。他们可能在某些情况下工作地很好,也可能在其它情况下不行,所以,垃圾回收器并不总是服从这两个参数设置。
另外,新生代的内存大小可以被设置,这个参数同样会影响“疏散暂停”的时间:
-XX:+G1YoungGenSize=512m (设置新生代内存为 512兆字节)
G1 同样可以使用survivor 空间,是的,这就是多少个区域。大小可以由通用的参数所指定(如: -XX:SurvivorRatio=6).
最后,如果你要发挥G1的所有潜能,你可以尝试设置下面两个参数,它们默认上是关闭的,因为在一些很稀有的情况下,这两个参数会发生race condition(竞争条件):
-XX:+G1ParallelRSetUpdatingEnabled
-XX:+G1ParallelRSetScanningEnabled
还有一件事是G1能够报告比其它垃圾回收站更详细的信息,当然,你需要设置下面这个参数:
-XX:+PrintGCDetails
这个参数会输出很多有用的信息供你查看性能与以 trouble-shooting。如果你想要简单的日志,你可以把这个开关设置到 -verbosegc 。
状态
◆G1 开发目前主要关注于解决一些残留的稳定性的问题,以及提高性能,并且去除下面的限制:
◆G1 并不完全支持 JVM Tool Interface (JVM TI) 或 Java Management Extensions (JMX),所以,这些监控和管理工具无法正确地作用于G1。
◆G1 不支持增量的永生代collection。如果一个应用在卸载很多的类,因些需要很多的永生代Collection,目前的G1还不支持,不过最终版会支持。
关于垃圾回收器的暂停时间,G1的表现比起CMS来说是时好时坏。所以,还有很多工作需要让G1的表现更加稳定,绝不能比CMS还差,不然G1还有什么意思呢?
分享到:
相关推荐
本文将深入探讨Java中的垃圾收集机制,包括其工作原理、不同类型的垃圾收集器以及它们在实际应用中的使用。 Java语言的一大卖点是它提供了自动内存管理,这意味着程序员不需要手动分配和释放内存,从而减少了内存...
.NET垃圾收集机制是.NET平台的核心组成部分,它负责自动管理应用程序的内存,确保高效且安全地使用内存资源。本文将深入探讨.NET垃圾收集的算法、工作方式以及相关的关键方法。 首先,垃圾收集的基本思想是追踪并...
本文将深入探讨Java中的垃圾回收机制,包括其工作原理、常用算法以及实际应用中的注意事项。 #### 二、垃圾回收的基本概念 **1. 什么是垃圾回收** 垃圾回收(Garbage Collection, GC)是指在程序运行过程中自动...
通过以上的讨论,我们可以看到,尽管Java在早期版本中由于垃圾收集机制可能在性能上不如C++,但随着垃圾收集技术的不断改进,Java已经能够提供与C++相竞争的性能,尤其是在对象创建和内存管理方面。这得益于JVM中...
本文将深入探讨Java垃圾回收机制的核心原理及其关键技术。 #### 二、Java堆内存 Java的堆是一个运行时数据区,用于存储所有对象实例。这些对象是通过`new`、`newarray`、`anewarray`和`multianewarray`等指令创建...
JVM垃圾回收机制包含以下几种典型的垃圾收集算法: - 标记-清除算法:先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。这种方法简单但效率低下,且会产生大量内存碎片。 - 复制算法:将内存...
本文详细探讨了JVM中的垃圾收集器和垃圾收集算法,以帮助开发者深入理解Java虚拟机的内部运作机制。 垃圾收集(GC,Garbage Collection)是JVM的一个重要功能,用于自动释放不再使用的对象所占用的内存空间,以防止...
当前的Java虚拟机(JVM)中的垃圾收集机制已经相当成熟,其中包括多种不同的垃圾收集器和相应的算法。 文档接着介绍了垃圾收集算法的基础和实现。垃圾收集算法根据其处理的内存区域分为几个不同的种类,包括在年轻...
2. 垃圾收集机制:垃圾收集是JVM用来自动管理内存的一种机制,其主要目标是识别并处理不再被程序使用的对象,回收它们占用的内存空间。垃圾收集机制通过各种算法来优化内存使用,减少程序运行时的内存泄漏。 3. 分...
除了基本的垃圾收集机制,Python还提供了一些高级特性,例如`__del__`方法,允许开发者在对象被销毁前执行一些清理工作。然而,由于垃圾收集的不确定性,不应依赖`__del__`方法来保证资源的释放,因为它可能不会立即...
- **垃圾收集器**:如Serial、ParNew、Parallel Scavenge、CMS、G1等,各有特点,适用于不同场景。 理解JVM内存模型和垃圾回收机制对于优化Java应用性能、避免内存泄漏和有效利用资源至关重要。开发者应根据实际...
自动垃圾收集机制是JavaScript引擎中非常重要的一部分,它的主要任务是识别并回收那些不再使用的内存,以防止内存泄漏。本文将深入探讨JavaScript的两种主要的垃圾收集方式:标记清除和引用计数。 首先,我们来看...
JavaScript是一种动态类型的编程语言,它的内存管理主要依赖于垃圾收集机制。这个机制自动处理内存的分配和回收,使得开发者无需像在C++或C中那样手动管理内存。本文将深入探讨JavaScript中的两种主要垃圾收集策略:...
本篇内容将深入探讨Java虚拟机中的垃圾收集机制,包括不同类型的垃圾收集器、其工作原理以及如何选择合适的垃圾收集器以满足特定应用的需求。 #### 垃圾收集的新发展 近年来,随着计算机硬件的发展和技术的进步,...
200 行的代码可能只是一个简单的示例,展示基础的垃圾收集机制,例如只处理了部分内存分配情况,或者仅实现了简单的引用计数。 通过学习和实践这个小型的 C 语言垃圾收集器,开发者可以更好地理解和掌握内存管理的...
本文深入探讨了Java垃圾回收机制的特点及其在Java虚拟机(JVM)中的应用,并详细分析了几种典型的垃圾收集算法。此外,文章还介绍了如何通过命令行参数来调整垃圾回收的行为以及`finalize`方法的作用。通过理解这些...
例如,FAT(文件分配表)文件系统常采用简单的空闲簇链表来回收空间,而日志型文件系统如JFFS2和YAFFS,则使用日志结构结合垃圾收集来优化性能。这些系统在写入时会先将数据写入新的位置,然后在后台进行垃圾回收,...