JVM-垃圾收集器

       通过学习了解到现在商用的JVM中的垃圾收集采用的是分代收集算法,即针对不同年代采用不同的收集算法。在JVM中,GC主要作用于堆内存中,堆内存又被划分为新生代和老年代,由于新生代对象绝大多数是朝生夕死,而老年代相对存活时间就很长,故而需要使用不同的垃圾收集机制,所以垃圾收集器也就分为新生代收集器和老年代收集器,两者相互组合进行JVM堆内存的空间回收(下图中相连的垃圾收集器表示可以相互组合,注意Serial Old和CMS也可以联合进行老年代的垃圾收集)。JDK6u14中开始测试的G1垃圾收集器,正式发布于JDK7u4中,是目前唯一不需要依赖其他垃圾收集器即可完成新生代和老年代内存收集。阅读之前先了解,GC的两个指标:暂停时间-应对与存在大量用户交互的场景;吞吐量-应对后台计算任务。

  • 新生代的垃圾收集器有:Serial收集器、ParNew收集器、Parallel Scavenge收集器
  • 老年代的垃圾收集器有:Serial Old收集器、Parallel Old收集器、CMS收集器
  • G1收集器。http://f.dataguru.cn/thread-514678-1-1.html

 

笔者使用的是JDK7u51,也就是JDK1.7.0_51

    下面我将试着通过自己的理解来分析各个垃圾收集器的特点,目前并没有一个适用于任何场景的垃圾收集器,所以选择何种垃圾收集器进行配合是根据具体应用来区别对待的,那么了解各种垃圾收集器的特点以及他们之间是否可以相互配合,就十分重要了。

    垃圾收集器运行过程中必然会发生“Stop the world”,只是时间长短和暂停时间可不可控的区别。

    在进行下面的阅读之前,首先明确在垃圾收集器中,“并发”和“并行”这两个概念的差别:

  1. 并行(Parallel):多个垃圾收集线程并行工作,此时用户线程处于等待状态
  2. 并发(Concurrent):垃圾收集线程和用户线程同时执行(不一定是并行,可能是交替执行),用户程序继续执行,而GC运行在另一个CPU上

  • Serial

       Serial垃圾收集器,通过这个单词的意思“连续”,我认为这个应该是指的GC之后内存空间不存在内存碎片的意思,那么必然不会采用“标记-清除算法”来实现,所以这个垃圾收集器在新生代使用的是“复制算法”,而Serial Old作为Serail收集器的老年代版本,使用的就是“标记-整理算法”。<

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
JVM (Java Virtual Machine) G1 (Garbage-First) 垃圾收集器是一种用于 Java 应用程序的垃圾收集算法。它是自JDK 7u4版本后引入的一种全新的垃圾收集器。 G1垃圾收集器的设计目标是为了解决传统的分垃圾收集器可能遇到的一些问题,如停顿时间长、内存碎片化等。它采用了一种基于区域的垃圾收集方式,可以将内存划分为多个大小相等的区域,每个区域可以是Eden、Survivor或Old区。 G1垃圾收集器的工原理如下: 1. 初始标记(Initial Mark):标记所有从根对象直接可达的对象。 2. 并发标记(Concurrent Mark):在并发执行程序的同时,标记那些在初始标记阶段无法访问到的对象。 3. 最终标记(Final Mark):为并发标记阶段中发生改变的对象进行最终标记。 4. 筛选回收(Live Data Counting and Evacuation):根据各个区域的回收价值来优先回收价值低的区域。 G1垃圾收集器具有以下特点: - 并发执行:在执行垃圾收集过程时,尽可能减少应用程序的停顿时间。 - 分区回收:将整个堆划分为多个区域,可以根据需要优先回收垃圾较多的区域,从而避免全堆回收来的长时间停顿。 - 内存整理:G1垃圾收集器会对内存进行整理,减少内存碎片化,提高内存利用率。 需要注意的是,G1垃圾收集器并不适用于所有情况。在特定的场景下,如大堆情况下的长时间运行、对延迟要求非常高的应用等,可能需要考虑其他垃圾收集器的使用。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值