`
liyuzhel312
  • 浏览: 6164 次
社区版块
存档分类
最新评论

关于Jvm垃圾回收的总结

 
阅读更多
这是第一次写东西,有什么不对的地方请大家指教,
这篇是对周志明老师的那本书有关Jvm垃圾收集器的总结
1.对象已死
    引用计数
    根搜索
    判断对象是否已死亡需要进行两次标记
 

 
2.垃圾收集算法
    标记-清除:标记需要回收的对象,然后进行清除,这个效率不高,也容易产生内存碎片
    复制算法:就是把内存分块(可以按不同的比例),两块儿中始终有一块儿为空,当一块儿满了之后,把存活的对象复制到另一块,死亡的对象进行清除,这个理念也就产生了HotPot的eden与survivor之分了(老年代一般都不用这个算法)
    标记-整理:让活着的对象向内存的一端移动,剩余死亡的对象清除
    分代收集算法:分为老年代与年轻代,这个算法只是提出了一个分代理念,具体的收集还是需要以上三个或者是其他的算法
 
3.垃圾收集器:如果说收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现
    其中sun公司的Hotspot主要又一下几种垃圾收集器
    年轻代:Serial   ParNew    ParallelScavenge 
    老年代:CMS(1,2,5)   Serial Old(MSC)(1,2,3,4)  ParallelOld(3)
    还有一个G1收集器,这个是最新的垃圾收集器
    这是各个收集器搭配示意图
    

 
 
    一下是各个收集器详细的介绍:
        Serial收集器是一个古老的单线程收集器,他在收集垃圾的时候会发生STW(Stop The World)现象,而且Serial/SerialOld使用的收集算法不同,前者使用的是复制算法,后者是标记整理算法,如下图所示


 
                    

 
他的优势就在于简单高效,没有线程交互的开销,只专注于垃圾回收,Serial收集器对于运行在Client模式下的虚拟机是一个很好的选择,其中如果在SerialOld在server模式下使用还有两个用途与ParallelScanvage配合使用,还可以做cms的预备方案,在Concurrent mode failure失败的时候使用。
        
        ParNew收集器是Serial收集器的多线程版本,除了使用多线程进行垃圾收集之外,其余行为包括Serial收集器可用的所以控制参数、收集算法、STW、对象分配规则,回收策略与Serial收集器都完全一样,示意图如下:


 
 
他是许多server模式下的首选的新生代收集器,除了Serial收集器他是一个能与CMS搭配的收集器(Parallel不能与CMS搭配使用),他在单cpu的情况下并不比serial收集器的性能好,甚至双核的情况下页不比serial性能要好,但是随着cpu增加的情况下还是有优势的
 
        ParallelScanvage是一个新生代收集器,也是使用并行的多线程收集器,看上去都和ParNew都一样,但是他还有他的特别之处,
他与其他的关注点不一样,cms关注的是最少停顿时间,而他关注的是最大吞吐量(运行代码时间(系统运行时间)/垃圾收集时间+运行代码时间),停顿时间短是使用哪种交互场景,有良好的相应速度能够提高用户的使用体验,最大吞吐量是可以高效的利用cpu,最短的完成任务,尽快的完成任务,主要是应用到后台应用,而不需要太多的交互任务。他可以是用参数精确的控制吞吐量,他也被称为吞吐量优先收集器,他有一个参数UserAdativeSizePolicy,他可以控制GC自适应调整,不需要指定新生代大小,已经eden与survivor的比例,这种策略称为GC自适应调整策略,这也是与ParNew的区别之一
 
        ParallelOld收集器的产生主要是为了与ParallelScanvage配合使用,后者原来只能与Serialold使用,而前者出现后才是后者成为名副其实的吞吐量优先的收集器,在注重吞吐量与cpu敏感的场合,可优先使用ParallelOld与ParallelScanvage组合
 
        CMS收集器是已获取停顿时间最短的为目标收集器,他特别适合那种重视相应速度,希望停顿时间最短,给用户带来良好的体验,如互联网应用。全拼是 Concurrent Mark Sweep,该收集器使用的是标记-清除算法,他的工作过程主要有以下几步:
        初始标记(STW)
        并发标记
        重新标记(STW)
        并发清除
        初始标记与重新标记仍然会STW,初始标记只是标记GC ROOTS能标记到的对象,速度很快,重新标记为了修正并发标记的时间,因用户用户程序继续运作,而导致标记发生变化的那一部分进行标记(不是太理解),这个阶段比初始标记要长一些,但是远比并发标记要短。如下图所示


 
CMS并发收集,低停顿。但是他还有一些缺点:
    对CPU比较敏感,当CPU少于4个的时候,性能会下降很多,这是根据他的计算公式来决定的。
    无法收集浮动的垃圾,因为在并发清除的工程中,用户的程序仍然在进行,而收集器没有对这时候产生的垃圾进行标记,所以就产生了浮动的垃圾,因此CMS无法像其他收集器一样等老年代满了之后再运行,当内存达到一定比例的时候就会运行,默认的情况下达到68%的时候就会启动CMS,当应用的老年代的垃圾增长速度较慢,可以适当的挑高这个参数。当在运行的过程中,剩余的内存大小无法满足用户运行,就会发生Concurrent mode failure,这时候虚拟机就会启动预备方案Serial old来进行收集,这样停顿时间就会增大,当那个比例设置的较大的时候就会出现这种情况。
    由于CMS使用的是标记-清除算法,这种算法会产生大量的碎片,因此当内存无法为一个大的对象分配合理的内存,就会触发FULLGC,因此可以使用一个参数,当FULLGC过后,就会进行碎片整理,也可以设置另一个参数在经过多少次FullGC后进行碎片整理。
 
        G1收集器使用了标记-整理的算法,他不会产生碎片,而且可以精确的控制停顿时间,他能让使用者指定在M毫秒内,消耗垃圾时间不会大于N秒,这机会是实时Java(RTSJ)收集器的特征。G1收集器基本上是在不牺牲吞吐量的情况下完成低停顿的内存回收。这是由于G1极力避免全代的垃圾回收,只是回收部分区域。他将老年代与年轻代分为各种不同的区域,而且大小是独立固定的,并且跟踪区域中的垃圾堆积度,后台维护一个优先列表,每次根据运行的垃圾收集时间,来优先收集垃圾最多的区域,这就是G1的由来(Garbage First),这种区域划分以及划分优先级,可以保证G1在有限的时间内获得最高的收集效率。
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 

分享到:
评论

相关推荐

    JVM垃圾回收机制.xmind

    自己学习总结JVM垃圾回收机制的结构图,一起分享!!!

    jvm垃圾回收机制总结

    总结,理解JVM的垃圾回收机制对于优化Java应用程序的性能至关重要。开发者应根据应用的特性和需求,选择合适的垃圾回收器,并通过调整相关参数,以达到最佳的系统性能。同时,编写代码时也要遵循良好的内存管理实践...

    JVM垃圾回收机制与GC性能调优

    Java虚拟机(JVM)的垃圾回收(GC)机制是Java程序高效运行的关键部分,它自动管理内存,释放不再使用的对象以避免内存泄漏。本文主要探讨JVM堆内存的结构和GC的工作原理,以及如何进行性能调优。 JVM堆是Java应用...

    JVM的垃圾回收机制详解和调优

    Java虚拟机(JVM)是Java程序运行的基础,它的核心组成部分之一就是垃圾回收(Garbage Collection,简称GC)。GC是JVM自动管理内存的主要方式,它负责识别并清理不再使用的对象,以避免内存泄漏和资源浪费。理解并...

    JVM垃圾回收艺术

    《JVM垃圾回收艺术——探索Tenured Generation的内涵》 在深入探讨JVM垃圾回收机制的艺术之前,我们先来理解一下“天才”的定义——一种对事业、对工作的极度热爱。JAVA垃圾回收(GC)同样展现出这种对效率和优化的...

    垃圾回收系列(3):CLR与JVM垃圾回收器的比较扫描.pdf

    总结来看,CLR和JVM都利用分代式垃圾回收策略,但各自实施的方式和优化策略各有侧重。CLR的垃圾回收机制以其模块化和层次化的特点,允许开发者根据应用需求选择合适的垃圾回收配置。JVM的垃圾回收则提供了更为多样的...

    JVM入门实战/arthas实战/垃圾回收算法/垃圾回收器/jvm内存模型分析

    第四节:垃圾回收算法 1.1标记清除算法 1.2复制算法 1.3 标记整理(标记压缩)算法 第五节:垃圾回收器 1.1Serial/Serial Old收集器 1.2 ParNew收集器 1.3Parallel Scavenge收集器 1.4Parallel Old收集器 1.5CMS...

    JVM之基本的垃圾回收算法汇总

    总结来说,JVM的垃圾回收算法有多种,每种都有其适用场景和优缺点。开发者需要根据应用的需求选择合适的垃圾回收策略,以优化内存管理和提升系统性能。理解这些基础的垃圾回收算法有助于我们更好地调试和调优Java...

    JVM垃圾回收.jpg

    jvm 垃圾回收思维导图,总结了现有的垃圾回收器的有点以及使用场景、垃圾回收算法以及回收的判断依据。

    JVM的工作原理及垃圾回收机制介绍

    ### JVM工作原理及垃圾回收机制详解 #### 一、JVM概述及原理 **1.1 JVM概述** Java Virtual Machine (JVM),即Java虚拟机,是一种虚构的计算机,在实际的计算机硬件上仿真模拟出的一套完整的计算机系统,用于执行...

    jvm内存和垃圾回收.xmind

    自己总结的jvm中内存和垃圾回收的笔记,绘制了详细的思维导图,每个思维导图中均有详细的博文解释,方便大家学习和理解,免费分享给大家。适合jvm的爱好者和学习者

    JVM垃圾回收与调优详解1

    《JVM垃圾回收与调优详解1》 Java虚拟机(JVM)的内存管理和垃圾回收是其性能优化的关键环节。本文主要探讨JVM内存分配、对象回收的判断标准以及垃圾收集算法。 1. JVM内存分配与回收 在JVM中,内存分为新生代、...

    JVM调优总结

    1.4 JVM调优总结(三)-基本垃圾回收算法 9 1.5 JVM调优总结(四)-垃圾回收面临的问题 12 1.6 JVM调优总结(五)-分代垃圾回收详述1 14 1.7 JVM调优总结(六)-分代垃圾回收详述 1.8 JVM调优总结(七)-典型配置...

    JVM内存分配与垃圾回收详解

    JVM 内存分配与垃圾回收详解 Java 虚拟机(JVM)是 Java 语言的 runtime 环境,它提供了一个平台独立的方式来执行 Java 字节码。JVM 内存分配与垃圾回收是 JVM 中两个非常重要的概念,本文将对 JVM 内存分配与垃圾...

    JVM常用垃圾回收器的特性与使用场景.md

    该文档总结了JVM主要的七种垃圾回收器特点与区别,分别描述了他们作用于堆内存的哪些区域,采用单线程还是多线程工作方式,在运行过程中是否需要暂停其他用户工作线程。是笔者对周志明老师的《深入理解java虚拟机》...

    JVM垃圾回收分享(文字在博客)

    【JVM垃圾回收分享】 Java语言的一大亮点是其自动内存管理机制,这使得开发者无需手动管理内存,从而避免了常见的内存泄漏和指针越界问题。这种机制通过垃圾回收(Garbage Collection,简称GC)来实现,确保了程序...

    JVM之垃圾回收器

    总结来说,JVM的垃圾回收器选择和调优是一项复杂的工作,需要根据应用类型、内存大小、响应时间要求等因素综合考虑。理解各种GC的工作原理和特点,结合实际应用进行选择,是提升Java应用性能的关键步骤。在实践中,...

    JVM结构+垃圾回收器+锁总结.xmind

    JVM结构+垃圾回收器+锁总结

    jvm内存基本结构及垃圾回收

    垃圾回收是JVM自动进行内存管理的一种机制,其主要目标是回收不再使用的对象所占用的内存空间,以防止内存泄漏。GC分为多个阶段: 1. **标记(Marking)**:确定哪些对象是“活的”,哪些是可回收的。常见的算法有...

    JVM调优总结(4)分代垃圾回收Java开发Java经验技

    本篇文章将详细讲解"JVM调优总结(4)分代垃圾回收"这一主题,旨在帮助Java开发者掌握更加高效、稳定的应用运行策略。 一、分代垃圾回收理论基础 Java的内存管理主要依靠垃圾回收机制,它自动回收不再使用的对象,...

Global site tag (gtag.js) - Google Analytics