摘自:
http://developer.51cto.com/art/201001/175883.htm
本文来自和你在一起的博客,原文标题为《JVM调优总结(五)-分代垃圾回收详述1》。文章总结了JVM垃圾回收策略为什么要分代,如何分代,以及垃圾回收的触发因素。
为什么要分代
分代的垃圾回收策略,是基于这样一个事实:不同的对象的生命周期是不一样的。因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率。
在Java程序运行的过程中,会产生大量的对象,其中有些对象是与业务信息相关,比如Http请求中的Session对象、线程、Socket连接,这类对象跟业务直接挂钩,因此生命周期比较长。但是还有一些对象,主要是程序运行过程中生成的临时变量,这些对象生命周期会比较短,比如:String对象,由于其不变类的特性,系统会产生大量的这些对象,有些对象甚至只用一次即可回收。
试想,在不进行对象存活时间区分的情况下,每次垃圾回收都是对整个堆空间进行回收,花费时间相对会长,同时,因为每次回收都需要遍历所有存活对象,但实际上,对于生命周期长的对象而言,这种遍历是没有效果的,因为可能进行了很多次遍历,但是他们依旧存在。因此,分代垃圾回收采用分治的思想,进行代的划分,把不同生命周期的对象放在不同代上,不同代上采用最适合它的垃圾回收方式进行回收。
如何分代
如图所示:
虚拟机中的共划分为三个代:年轻代(Young Generation)、年老点(Old Generation)和持久代(Permanent Generation)。其中持久代主要存放的是Java类的类信息,与垃圾收集要收集的Java对象关系不大。年轻代和年老代的划分是对垃圾收集影响比较大的。
年轻代:
所有新生成的对象首先都是放在年轻代的。年轻代的目标就是尽可能快速的收集掉那些生命周期短的对象。年轻代分三个区。一个Eden区,两个Survivor区(一般而言)。大部分对象在Eden区中生成。当Eden区满时,还存活的对象将被复制到Survivor区(两个中的一个),当这个Survivor区满时,此区的存活对象将被复制到另外一个Survivor区,当这个Survivor去也满了的时候,从第一个Survivor区复制过来的并且此时还存活的对象,将被复制“年老区(Tenured)”。需要注意,Survivor的两个区是对称的,没先后关系,所以同一个区中可能同时存在从Eden复制过来 对象,和从前一个Survivor复制过来的对象,而复制到年老区的只有从第一个Survivor去过来的对象。而且,Survivor区总有一个是空的。同时,根据程序需要,Survivor区是可以配置为多个的(多于两个),这样可以增加对象在年轻代中的存在时间,减少被放到年老代的可能。
年老代:
在年轻代中经历了N次垃圾回收后仍然存活的对象,就会被放到年老代中。因此,可以认为年老代中存放的都是一些生命周期较长的对象。
持久代:
用于存放静态文件,如今Java类、方法等。持久代对垃圾回收没有显著影响,但是有些应用可能动态生成或者调用一些class,例如Hibernate等,在这种时候需要设置一个比较大的持久代空间来存放这些运行过程中新增的类。持久代大小通过-XX:MaxPermSize=<N>进行设置。
什么情况下触发垃圾回收
由于对象进行了分代处理,因此垃圾回收区域、时间也不一样。GC有两种类型:Scavenge GC和Full GC。
Scavenge GC
一般情况下,当新对象生成,并且在Eden申请空间失败时,就会触发Scavenge GC,对Eden区域进行GC,清除非存活对象,并且把尚且存活的对象移动到Survivor区。然后整理Survivor的两个区。这种方式的GC是对年轻代的Eden区进行,不会影响到年老代。因为大部分对象都是从Eden区开始的,同时Eden区不会分配的很大,所以Eden区的GC会频繁进行。因而,一般在这里需要使用速度快、效率高的算法,使Eden去能尽快空闲出来。
Full GC
对整个堆进行整理,包括Young、Tenured和Perm。Full GC因为需要对整个对进行回收,所以比Scavenge GC要慢,因此应该尽可能减少Full GC的次数。在对JVM调优的过程中,很大一部分工作就是对于FullGC的调节。有如下原因可能导致Full GC:
· 年老代(Tenured)被写满
· 持久代(Perm)被写满
· System.gc()被显示调用
·上一次GC之后Heap的各域分配策略动态变化
相关推荐
Java虚拟机(JVM)是Java程序运行的基础,它的核心组成部分之一就是垃圾回收器(Garbage Collector, GC),以及内存分配策略。理解这些概念对于优化Java应用性能至关重要。本篇文章将深入探讨JVM的垃圾回收机制以及...
Java虚拟机(JVM)是Java程序运行的基础,它的核心组成部分之一就是垃圾回收(Garbage Collection,简称GC)。GC是JVM自动管理内存的主要方式,它负责识别并清理不再使用的对象,以避免内存泄漏和资源浪费。理解并...
**垃圾回收策略**: - **对象晋升策略**:大对象直接进入老年代,长期存活的小对象也会晋升。 - **垃圾收集器**:如Serial、ParNew、Parallel Scavenge、CMS、G1等,各有特点,适用于不同场景。 理解JVM内存模型和...
它与Parallel Old回收器搭配,用于老年代垃圾回收,两者都属于吞吐量优先的策略。 4. **CMS回收器**(Concurrent Mark Sweep):以低延迟为目标,尽量减少应用程序的暂停时间,通过并发地执行大部分垃圾回收任务。...
基于对象生命周期的特性,分代收集算法将对象按照生存周期的不同划分为不同的区域,并针对不同区域采用不同的垃圾回收策略。现代的垃圾回收器(从J2SE 1.2开始)通常采用这种算法。 - **年轻代**(Young Generation...
Java虚拟机(JVM)内存管理和垃圾回收是Java编程中至...总结来说,理解JVM的内存管理与垃圾回收机制对于优化Java应用性能至关重要,开发者需要根据应用特点选择合适的垃圾回收策略和参数设置,以实现高效且稳定的运行。
JVM的垃圾回收策略通常是组合使用的,例如,并行GC与CMS配合,以实现高效且低延迟的垃圾回收。 理解JVM内存管理和垃圾回收机制对于优化Java应用的性能至关重要。开发者可以根据应用的需求和特点,通过调整JVM参数来...
此外,内存分配的速度和垃圾回收策略直接影响到JVM的性能指标,如吞吐量(应用程序的执行时间与总时间的比率)和暂停时间(垃圾回收导致的应用暂停的时长)。 总之,JVM内存管理和垃圾回收是优化Java应用性能的关键...
**JVM之垃圾回收器** Java虚拟机(JVM)是Java编程语言的核心组成部分,它负责执行字节码并管理程序运行时的内存。在JVM的内存模型中,垃圾回收(Garbage Collection, GC)是一项重要的功能,它自动识别并清理不再...
理解JVM垃圾回收机制对于优化Java应用性能至关重要。 1. **垃圾回收的基本概念** - **对象生命周期**:在Java中,对象的生命周期包括创建、使用和销毁。当对象不再被引用时,就被认为是“垃圾”。 - **垃圾回收器...
基于这一假设,JVM将堆内存划分为不同的区域,不同区域采用不同的垃圾回收策略。 - **新生代(Young Generation)**: 包含Eden区和两个Survivor区(S0和S1)。对象首先在Eden区分配,经过一次或多次垃圾回收后仍然...
分代收集算法是根据对象的生命周期将其分为年青代、年老代和持久代(或称为永久代),并针对不同代的对象使用不同的垃圾回收策略。这种算法在现代的垃圾回收器中都有所应用。 按照系统线程分,垃圾回收算法分为串行...
《JVM垃圾回收艺术——探索Tenured Generation的内涵》 在深入探讨JVM垃圾回收机制的艺术之前,我们先来理解一下“天才”的定义——一种对事业、对工作的极度热爱。JAVA垃圾回收(GC)同样展现出这种对效率和优化的...
开发者应该依赖JVM的默认垃圾回收策略,或者通过设置JVM参数来调整适合应用的垃圾回收策略,而不是频繁地手动触发垃圾回收。 总之,垃圾回收是Java程序内存管理的关键组成部分,JVM通过复杂的算法和策略来优化这一...
G1是JVM的一种分代垃圾收集器,引入了Region的概念,目标是预测并控制垃圾回收停顿时间。G1不仅在年轻代和老年代之间,还在Region内部进行垃圾回收,解决了CMS的内存碎片问题。G1采用了混合GC策略,可以在一次GC...
总之,JVM内存管理和垃圾回收是Java开发中的重要概念,理解其工作原理有助于编写高效、稳定的代码,并避免因内存问题导致的程序异常。通过不断优化和调整,开发者可以更好地掌控Java应用的性能。
本教程将涵盖Java的基础知识,特别是关于内存管理的重要概念——Java内存区域、Out of Memory (OOM)错误以及垃圾回收器和垃圾回收策略。 1. **Java入门**: Java的学习始于基础语法,包括变量、数据类型、运算符、...
为了监控和优化JVM的垃圾回收,开发者可以使用如VisualVM、JConsole、JMX等工具,通过观察内存分配、垃圾回收日志、GC停顿时间等指标来调整JVM参数,比如设置最大堆大小、年轻代和老年代的比例、GC算法选择、晋升...
Java虚拟机(JVM)是Java程序的核心,它负责管理程序的运行时环境,包括...通过调整JVM参数,优化垃圾回收策略,可以显著提升应用的性能和稳定性。对于Java程序员而言,深入理解这些概念和原理是提升技术水平的关键。