`
phoenix520
  • 浏览: 142277 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Java新型垃圾回收器G1深入探索

    博客分类:
  • Java
阅读更多

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垃圾回收器的工作原理及其应用。 1. **Java内存模型** - Java内存分为堆内存(Heap)和栈内存(Stack)。堆内存主要存储对象实例,而栈内存则存储方法调用时的局部...

    Java垃圾回收原理

    如果一个对象没有任何引用指向它,那么这个对象就可以被视为垃圾,并可被垃圾回收器回收。 #### 三、Java中的垃圾回收器 ##### 3.1 Serial Collector Serial Collector是最简单的垃圾回收器,它只使用单线程进行...

    新一代垃圾回收器ZGC设计与实现.ch01.print1

    Java垃圾回收器是Java虚拟机(JVM)的关键组成部分,它自动管理程序的内存,确保对象的生命周期得到妥善处理,从而避免内存泄漏。本章主要介绍了垃圾回收算法和JVM中实现的不同类型的垃圾回收器。 首先,垃圾回收的...

    java垃圾回收

    Java提供了多种垃圾收集器,如Serial GC、Parallel GC、CMS(Concurrent Mark Sweep)、G1(Garbage-First)和ZGC(Zing Garbage Collector)等。不同的垃圾收集器有不同的性能特点,适用于不同的应用场景。例如,...

    G1垃圾回收器论文【免积分下载】

    G1垃圾回收器是一种面向服务器端的应用场景设计的新型垃圾回收器。其主要目标是: - 在多处理器且具备大容量内存的硬件环境下实现高吞吐量。 - 满足软实时要求,即尽可能减少长时间的暂停时间,确保应用程序的响应...

    Java软件开发实战 Java基础与案例开发详解 2-6 java的垃圾回收器 共4页.pdf

    - **垃圾回收器类型**:不同的垃圾回收器有不同的特点和适用场景,例如G1垃圾回收器适用于大内存的应用场景。 #### 7. 总结 垃圾回收是Java语言的一项核心特性,极大地简化了内存管理,提高了程序的稳定性和性能。...

    JAVA垃圾回收面试个人总结.doc

    垃圾回收的优化通常涉及到调整堆大小、设置新生代和老年代的比例、选择合适的垃圾收集器组合(如Serial、ParNew、Parallel Scavenge、CMS、G1等)以及使用并发模式、并行度、暂停时间目标等参数。理解这些概念和原理...

    java C#垃圾回收算法分析

    本文将深入探讨Java和C#中的垃圾回收算法,帮助开发者理解其工作原理和优化策略。 首先,我们要明确垃圾回收的基本概念。在程序运行过程中,会动态分配内存来存储对象。当一个对象不再被引用时,它就变成了垃圾。...

    Java_GC垃圾回收调优指南

    例如,吞吐量优先的场景下可以选择并行垃圾回收器(Parallel GC),而响应时间优先的情况下则更适合使用并发标记清扫垃圾回收器(CMS)或G1垃圾回收器。 3. **监控和分析**:使用JVisualVM、Visual GC等工具监控...

    java垃圾回收及内存泄漏.pptx

    6. **垃圾收集器**:根据不同的垃圾收集算法,JVM提供了多种垃圾收集器,如Serial、ParNew、Parallel Scavenge、CMS、G1等。 #### 三、Java内存泄漏 1. **定义**:内存泄漏是指已经分配出去的内存没有被及时回收,...

    Java垃圾回收精粹-Part4Java开发Java经验技

    本篇将深入探讨Java垃圾回收的精华部分,以及在Java开发过程中的一些实用技巧。 一、垃圾回收的基本原理 Java的垃圾回收机制主要目标是识别并回收不再被程序引用的对象所占用的内存。它通过跟踪对象的可达性来判断...

    Java的垃圾收集器(GC)

    总之,垃圾收集器是Java生态系统中不可或缺的一部分,深入理解和合理运用GC机制,对于构建高效、稳定的Java应用程序至关重要。随着Java技术的不断演进,GC也将持续优化,为开发者带来更加便捷的开发体验。

    全面分析Java的垃圾回收机制

    除了上述基础算法,现代的Java垃圾回收器,如G1(Garbage-First)、ZGC(Z Garbage Collector)和Shenandoah,采用了更先进的策略,如并发标记、分代收集、增量收集等,以减少垃圾回收对应用程序性能的影响。...

    java入门、java内存区域和OOM、垃圾回收器和垃圾回收策略

    本教程将涵盖Java的基础知识,特别是关于内存管理的重要概念——Java内存区域、Out of Memory (OOM)错误以及垃圾回收器和垃圾回收策略。 1. **Java入门**: Java的学习始于基础语法,包括变量、数据类型、运算符、...

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

    第五节:垃圾回收器 1.1Serial/Serial Old收集器 1.2 ParNew收集器 1.3Parallel Scavenge收集器 1.4Parallel Old收集器 1.5CMS(Current Mark Sweep)收集器 1.6G1收集器 第六节:JVM参数调优 1.1 JVM重要参数介绍...

    JVM垃圾回收器工作原理及使用实例介绍Java开发Java

    本文将深入探讨JVM垃圾回收器的工作原理,并通过实例来帮助开发者理解和应用。 1. 垃圾回收概述 - 内存管理:Java中的内存分为堆内存和栈内存,垃圾回收主要针对堆内存。 - 对象生命周期:创建、使用、不再引用...

Global site tag (gtag.js) - Google Analytics