- 浏览: 25026 次
- 性别:
- 来自: 上海
文章分类
最新评论
文章总结了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=进行设置。
什么情况下触发垃圾回收
由于对象进行了分代处理,因此垃圾回收区域、时间也不一样。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的各域分配策略动态变化
发表评论
-
[转] JVM调优总结(十二)-参考资料
2010-05-06 10:55 857能整理出上面一些东西,也是因为站在巨人的肩上。下面是一些参考资 ... -
[转] JVM调优总结(十一)-反思
2010-05-06 10:53 760垃圾回收的悖论 所谓“成也萧何败萧何”。Java ... -
[转] JVM调优总结(十)-调优方法
2010-05-06 10:52 956JVM调优工具 Jconsole,jProfile,Vi ... -
[转] JVM调优总结(九)-新一代的垃圾回收算法
2010-05-06 10:50 1560垃圾回收的瓶颈 传统分代垃圾回收方式,已经在一定程度 ... -
[转] JVM调优总结(八)-典型配置举例2
2010-05-06 10:49 750常见配置汇总 堆设置 -Xms:初始堆大小 ... -
[转] JVM调优总结(七)-典型配置举例1
2010-05-06 10:46 825以下配置主要针对分代垃圾回收算法而言。 堆大小设置 ... -
[转] JVM调优总结(六)-分代垃圾回收详述2
2010-05-06 10:44 860分代垃圾回收流程示意 ... -
[转] JVM调优总结(五)-分代垃圾回收详述1
2010-05-06 10:41 982为什么要分代 分代的垃圾回收策略,是基于这样一个事实 ... -
[转] JVM调优总结(四)-垃圾回收面临的问题
2010-05-06 10:40 778如何区分垃圾 ... -
[转] JVM调优总结(三)-基本垃圾回收算法
2010-05-06 10:38 888可以从不同的的角度去 ... -
[转] JVM调优总结(二)-一些概念
2010-05-06 10:36 921Java对象的大小 基 ... -
[转] JVM调优总结(一)-- 一些概念
2010-05-06 10:27 821数据类型 Java ... -
[转]理解 Java 的 GC 与 幽灵引用
2010-05-06 09:56 878理解 Java 的 GC 与 幽灵 ... -
[转]利用jdk6查内存泄漏(见编写对GC友好,又不泄漏的代码)
2010-05-05 17:14 1321利用jdk6查内存泄漏(见编写对GC友好,又不泄漏的代码) ( ... -
通过GC输出分析内存泄露问题
2010-05-05 17:09 739参考以下文章 http://www.iteye.com/top ... -
【转】Java程序员必须了解GC的工作原理
2010-05-05 17:02 1021一个优秀的Java程序员必 ...
相关推荐
四大垃圾回收算法:复制算法、标记-清除算法、标记-整理算法、分代收集算法 七大垃圾回收器:Serial、Serial Old、ParNew、CMS、Parallel、Parallel Old、G1 JVM调优:命令行指令,设置堆内存大小的参数
自己总结的jvm中内存和垃圾回收的笔记,绘制了详细的思维导图,每个思维导图中均有详细的博文解释,方便大家学习和理解,免费分享给大家。适合jvm的爱好者和学习者
JVM垃圾回收器和内存分配策略
本系列课程从JVM基础到高级实战,老师手把手教你如何进行JVM调优,思路清晰,没有废话,旨在挑战高薪。 课程亮点: 1、基于阿里arthas进行JVM调优; 2、基于代码排查OOM问题,拒绝空讲; 3、总结JVM通用的调优思路;...
JVM的垃圾回收机制详解和调优
JVM内存管理和垃圾回收 JVM内存管理和垃圾回收 JVM内存管理和垃圾回收
自己学习总结JVM垃圾回收机制的结构图,一起分享!!!
JVM 内存分代、垃圾回收漫谈.docx
JVM垃圾回收器和内存分配策略
JVM调优总结(4)分代垃圾回收Java开发Java经验技巧共10页.pdf.zip
JVM结构+垃圾回收器+锁总结
jvm内存模型以及垃圾回收机制.pptx
垃圾回收调优及JVM参数详解
个人整理 jvm相关知识 包括内存分配机制 垃圾回收机制 垃圾收集器相关 及 垃圾收集算法
该文档总结了JVM主要的七种垃圾回收器特点与区别,分别描述了他们作用于堆内存的哪些区域,采用单线程还是多线程工作方式,在运行过程中是否需要暂停其他用户工作线程。是笔者对周志明老师的《深入理解java虚拟机》...
JVM_03 垃圾回收,工作笔记
JVM垃圾回收,为大家整理了JVM原理以及各种调优策略
JVM堆相关知识 为什么先说JVM堆? JVM的堆是Java对象的活动空间,程序中的类的对象从中分配空间,其存储着正在运行着的应用程序用到的所有对象。这些对象的建立方式就是那些new一类的操作,当对象无用后,是GC来...
Jvm垃圾回收机制 by linux_14胡嘉辉1.如何确定某个对象是“垃圾”? 2.典型的垃圾收集算法3.典型的垃圾收集器