目录

  • G1 概念
  • JVM的内存分代假设
  • 让用户设置应用的暂停时间

G1 概念

G1其实是Garbage First的意思,它不是垃圾优先的意思,而是优先处理那些垃圾多的内存块的意思。 在大的理念上,它还是遵循JVM的内存分代假设。

JVM的内存分代假设

JVM的内存分代假设是指:90%的对象熬不过第一次垃圾回收,而经历好几次垃圾回收的对象则由98%的概率会一直活下来。

  基于这个内存分代假设,一般垃圾回收器把内存分成三类:Eden(E)、Survivor(S)和Old(O), 其中Eden和Survivor都属于年轻代,Old属于老年代,新对象始终分配在Eden里面,熬过一次垃圾回收的对象就被移动到Survisor区了,经过多次垃圾回收之后还活着的对象会被移到Old区。

这样分代的好处是,把一个复杂的大问题,分成两类不同的小问题,针对不同的小问题,采用更有针对性的措施,分而治之。

  • 对于年轻代的对象,由于对象来的快去得快,垃圾收集会比较频繁,因此执行时间一定要短,效率要高。因此要采用执行时间短,效率高的垃圾收集器,但是这类回收器往往会比较浪费内存,比如Copying GC,会浪费一半的内存,以空间换取了时间。
  • 对于老年代的对象,由于本身对象的个数不多,垃圾收集的次数不多,因此可以采用对内存使用比较高效的算法。

跟其它垃圾回收器不一样的是:G1虽然也把内存分成了这三大类,但是在G1里面这三大类并不是三大块内存,G1把内存划分成很多小块, 每个小块会被标记为E/S/O中的一个。

这么做给G1带来了很大的好处,由于把三块内存变成了几百块内存,内存块的粒度变小了,从而可以让垃圾回收工作更彻底的并行化。

G1的并行收集做得特别好,G1整个收集全程几乎都是并行的,它回收的大致过程是这样的:

  • 在垃圾回收的最开始有一个短暂的时间段会停止应用(stop-the-world)。
  • 然后应用继续运行,同时G1开始进行标记(Concurrent Mark)。
  • 之后再次停止应用,来一个Final Mark (stop-the-world)。
  • 最后根据 G1 的原则,选择一些内存块进行回收。(stop-the-world)

由于 G1 的高度的并行化,因此它在 Stop-the-world 这个指标上比其它的GC算法都要好。

让用户设置应用的暂停时间

  G1的另一个显著特点他能够让用户设置应用的暂停时间,为什么G1能做到这一点呢?也许你已经注意到了,G1回收的第4步,它是“选择一些内存块”,而不是整代内存来回收,这是G1跟其它GC非常不同的一点,其它GC每次回收都会回收整个Generation的内存(Eden, Old), 而回收内存所需的时间就取决于内存的大小,以及实际垃圾的多少,所以垃圾回收时间是不可控的;而G1每次并不会回收整代内存,到底回收多少内存就看用户配置的暂停时间,配置的时间短就少回收点,配置的时间长就多回收点,伸缩自如。 (阿里面试)

由于内存被分成了很多小块,又带来了另外好处,由于内存块比较小,进行内存压缩整理的代价都比较小,相比其它GC算法,可以有效的规避内存碎片的问题。

说了G1的这么多好处,也该说说G1的坏处了,如果应用的内存非常吃紧,对内存进行部分回收根本不够,始终要进行整个Heap的回收,那么G1要做的工作量就一点也不会比其它垃圾回收器少,而且因为本身算法复杂了一点,可能比其它回收器还要差。因此G1比较适合内存稍大一点的应用(一般来说至少4G以上),小内存的应用还是用传统的垃圾回收器比如CMS比较合适。

  
  
  

论 G1 收集器的架构和如何做到回收时间用户设定相关推荐

  1. 直通BAT必考题系列:深入剖析JVM之G1收集器、及回收流程、与推荐用例

    金三银四马上到了,即将进入面试的高峰期.在BAT面试中,JVM基本都是必考的系列.你至少需要掌握JVM内存模型与JVM参数详细配置,JVM的4种垃圾回收算法.垃圾回收机制与总结,以及今天重点谈到的JV ...

  2. 27.垃圾收集器(Serial收集器、ParNew收集器、Parallel收集器、Parallel Old 收集器、CMS收集器、G1收集器、常用的收集器组合)

    27.垃圾收集器 27.1.Serial收集器 27.2.ParNew收集器 27.3.Parallel收集器 27.4.Parallel Old 收集器 27.5.CMS收集器 27.6.G1收集器 ...

  3. CMS 和 G1 收集器比较

    CMS 垃圾收集器 CMS(Concurrent Mark Sweep) 收集器是一种 以获取最短回收停顿时间为目标 的收集器. 目前很大一部分的Java应用集中在互联网站或者B/S系统的服务端上,这 ...

  4. 垃圾收集器(CMS收集器 , G1收集器…)

    Java堆内存被划分为新生代和年老代两部分,新生代主要使用复制和标记-清除垃圾回收算法,年老代主要使用标记-整理垃圾回收算法,因此java虚拟中针对新生代和年老代分别提供了多种不同的垃圾收集器,以下讲 ...

  5. java 指定垃g1圾收集_java垃圾回收G1收集器

    G1(Garbage First)收集器是当今收集器技术发展的最前沿成果之一,他是一款面向服务端的垃圾收集器,它的使命是(在比较长期的)未来可以替换掉CMS收集器.它的特点如下: 1.并行与并发:G1 ...

  6. java虚拟机收集器_Java虚拟机(JVM)垃圾回收器G1收集器 - Break易站

    G1收集器 G1(Garbage-First)是JDK7-u4才推出商用的收集器: 1.特点 (A).并行与并发 能充分利用多CPU.多核环境下的硬件优势: 可以并行来缩短"Stop The ...

  7. G1 收集器 面向服务端(多CPU)应用的垃圾回收器

    如果对你有帮助的话麻烦点个关注吧! 总则:首先收集尽可能多的垃圾(Garbage First), 一定程度上,可以理解为 是CMS在全局不分区的一种改进.G1并不会等内存耗尽(串行.并行)或者快耗尽( ...

  8. JVM - G1收集器、Region、停顿时间模型、垃圾回收(建议收藏)

    ​ Region 使用G1收集器时,java堆的内存会划分为多个大小相等的独立区域(Region),Region中也有新生代和老年代的概念,但是新生代和老年代不再是物理隔离的,它们都是一部分Regio ...

  9. CMS收集器和G1收集器的区别

    目录 CMS收集器和G1收集器的区别 区别一: 使用范围不一样 区别二: STW的时间 区别三: 垃圾碎片 区别四: 垃圾回收的过程不一样 对于CMS收集器和G1收集器的不同,目前简单写了一下4点,有 ...

最新文章

  1. IEEE 发布年终总结,AI 奇迹不再是故事
  2. azure devops中文显示乱码_【Azure DevOps系列】Azure DevOps生成代码覆盖率
  3. 2pc 3pc_在1990年代如何宣传PC
  4. Linux下Nginx的安装和简单管理
  5. UVA11005 Cheapest Base【数学】
  6. SQL语句——查询语句
  7. 有关scm和check style的pom.xml文件
  8. 用户场景法,设计测试用例
  9. 匈牙利算法python实现
  10. xss.haozi练习通关详解
  11. 微信公众号二次开发框架-微擎
  12. 计算机应用基础任务教化2010,【计算机应用论文】茶文化下的计算机应用基础课程改革(共5535字)...
  13. 分享 java 基础 + 进阶精简资料(视频 + 源码 + 就业项目 + 面试报装)
  14. 修改xcode字体大小(Mac)
  15. 查看患者信息java_Java通过反射查看类的信息示例
  16. 第一章 命题逻辑 1.7 推理理论
  17. 我的为人处事真的有问题吗?
  18. powershell操作excel
  19. Python基础部分学习笔记(一)
  20. 120帧手机动态壁纸_热门动态壁纸主题锁屏墙纸精选app下载-热门动态壁纸主题锁屏墙纸精选最新版下载v6.2...

热门文章

  1. 记一次mysql8报错的处理:The table /tmp/#sql~~~ is full
  2. linux删除磁盘分区
  3. 面试官: 说说H5测试点吧 !
  4. win2019服务器版游戏性能,Windows Server 2019新版:存储空间性能强化
  5. OpenStack Swift Account Reaper
  6. 最好的pdf转换成word转换器在线
  7. uni-app提供开箱即用的SSR支持
  8. 冬奥网络安全卫士助力实现零事故
  9. 游戏开发unity打包相关系列:使用IL2CPP时打包windows程序出现Currently selected scripting backend (IL2CPP) is not installed
  10. mysql聚簇索引设置_Mysql-聚簇索引