文章目录

  • Pre
  • 分代收集理论
  • 常见的垃圾收集算法
    • 标记-清除算法
    • 标记-复制算法
    • 标记-整理算法
  • 垃圾收集器
    • Serial收集器
    • Parallel Scavenge收集器 【JDK8默认】
    • ParNew收集器
    • CMS 【重点掌握】

Pre

JVM-04垃圾收集Garbage Collection(上)【垃圾对象的判定】

JVM-05垃圾收集Garbage Collection(中)【垃圾收集算法】

JVM-06垃圾收集Garbage Collection(下)【垃圾收集器】


分代收集理论

当前虚拟机的垃圾收集都采用分代收集算法 , 意思就是根据对象存活周期的不同将 java堆分为新生代和老年代,这样就可以根据各个年代的特点选择合适的垃圾收集算法。

举个例子,新生代中,大部分对象都是朝生夕死的,所以可以选择复制算法, 只复制那些少量存活的对象。

而老年代,绝大部分都是一些顽固的对象,存货周期较长,如果选择复制算法,就要复制很多对象,效率自然不高 ,所以得换个算法,通常会选择标记-清除”或“标记-整理”算法进行垃圾收集。


常见的垃圾收集算法


标记-清除算法

两个阶段 “标记” + “清除”

  1. 标记存活的对象, 也可以反过来,标记出所有需要回收的对象
  2. 标记完成后,统一回收所有未被标记的对象(一般选择这种)

存在两个问题

  1. 如果需要标记的对象太多,效率不高 【效率问题】
  2. 标记清除后会产生大量不连续的碎片 【内存碎片】

基于这个缺点,进化除了 标记-整理 ,多了一步整理内存碎片。


标记-复制算法

它将内存分为大小相同的两块,每次使用其中的一块。

当这一块的内存使用完后,就将还存活的对象复制到另一块去,然后再把使用的空间一次清理掉。

这样就使每次的内存回收都是对内存区间的一半进行回收。

  • 优点:常用于新生代,存活的对象少,复制这些存活的对象,效率高。

  • 缺点 显而易见: 浪费空间


标记-整理算法

根据老年代的特点演化出一种标记算法, 标记过程同“标记-清除” 。

移动所有存活的对象,且按照内存地址次序依次排列,然后将末端内存地址以后的内存全部回收。因此,第二阶段才称为整理阶段。


垃圾收集器

为什么会有这么多GC 回收器?

因为目前没有任何一款是十分完美的,我们需要做的就是充分了解这些GC Collector 根据业务特点选择合适的GC Collector 。


Serial收集器

两个收集器 。一个 新生代Serial , 一个 老年代 Serial Old .

新生代采用复制算法,老年代采用标记-整理算法。

JVM参数

-XX:+UseSerialGC (新生代)  -XX:+UseSerialOldGC (老年代)

Serial(串行)收集器是最基本、历史最悠久的垃圾收集器 。

字面意思:

  1. 单线程GC
  2. GC的时候STW
  3. 新生代 Serial , 复制算法
  4. 老年代Serial Old , 标记整理算法

Serial Old收集器是Serial收集器的老年代版本,也是一个单线程收集器。

它主要有两大用途:

  • 一种用途是在JDK1.5以及以前的版本中与Parallel Scavenge收集器搭配使用,
  • 另一种用途是作为CMS收集器的后备方案

Parallel Scavenge收集器 【JDK8默认】

Serial收集器的多线程版本

JVM参数

-XX:+UseParallelGC(年轻代),-XX:+UseParallelOldGC(老年代)

默认的收集线程数跟cpu核数相同,当然也可以用参数(-XX:ParallelGCThreads)指定收集线程数,但是一般不推荐修改。

Parallel Scavenge收集器关注点是吞吐量(高效率的利用CPU)

CMS等垃圾收集器的关注点更多的是用户线程的停顿时间(提高用户体验)

新生代采用复制算法,老年代采用标记-整理算法。

Parallel Old收集器是Parallel Scavenge收集器的老年代版本。使用多线程和“标记-整理”算法。

在注重吞吐量以及CPU资源的场合,都可以优先考虑 Parallel Scavenge收集器和Parallel Old收集器(JDK8默认的新生代和老年代收集器)。


ParNew收集器

What ? ParNew ? 不是有个Parallel 吗? 又出来这个主要是因为Parallel 不能和CMS搭配使用,所以官方又弄出个这么个玩意儿。

JVM参数

-XX:+UseParNewGC

ParNew收集器其实跟Parallel收集器很类似,区别主要在于它可以和CMS收集器配合使用。

新生代采用复制算法,老年代采用标记-整理算法。

互联网公司 小内存的机器 主流的GC组合 就是 ParNew + CMS .


CMS 【重点掌握】

JVM参数

-XX:+UseConcMarkSweepGC(老年代)

详细的四个步骤、CMS存在的问题以及三色标记我们下篇博文继续展开

JVM - 再聊GC垃圾收集算法及垃圾收集器相关推荐

  1. Hotspot虚拟机- 垃圾收集算法和垃圾收集器

    引言 声明:由于CSDN不支持Hexo支持的Markdown语法,大家看到{% asset_img 1st.png Mark and Sweep %}这样的标签时,就是一张图片.由于图片较多,我就不一 ...

  2. Java垃圾回收(GC)、找垃圾的方式、GC Root、GC停顿、引用、垃圾收集算法、收集器、GC日志、安全点、安全区域

    1.垃圾回收 1.1概念 在Java语言中,垃圾回收(Garbage Collection,GC)是一个非常重要的概念. 它的主要作用是回收程序中不再被使用的内存,Java提供的GC功能可以自动监测对 ...

  3. jvm相关,垃圾收集算法,垃圾收集器,jvm调优--学习笔记

    对内存合理分配,优化jvm 参数,就是为了尽可能减少新生代(Minor GC),或者是整个老年代(Major GC) ,或者是整个 Java 堆 (Full GC) ,尽量减少 GC 带来的系统停顿, ...

  4. JVM之垃圾收集算法和垃圾收集器详解

    这篇文章相比上一篇记录性的,多了不少我自己的理解,花费了很大的功夫整理,如果有时间和精力建议好好看一看深入理解JVM这本书. 也建议熟读背诵. JVM-垃圾收集器和内存分配策略 程序计数器.虚拟机栈. ...

  5. jvm 垃圾收集算法_JVM垃圾收集和优化

    jvm 垃圾收集算法 总览 在对系统进行性能相关问题的故障排除时,内存优化是一个需要深入分析每个系统在内存中存储的内容,存储时间和访问方式的场所. 这篇文章是要对背景信息进行注释,并在此工作中要注意一 ...

  6. JVM 垃圾收集算法及垃圾收集器

    1.对象的创建 在类加载检查通过后,虚拟机将为新生对象分配内存,对象所需内存的大小在类加载完成后就已经确定了.为对象分配空间等同于把一块确定大小的内存从Java堆中划分出来.有如下两种方式: 指针碰撞 ...

  7. JVM学习之GC常用算法

    2019独角兽企业重金招聘Python工程师标准>>> 出处:博客园左潇龙的技术博客--http://www.cnblogs.com/zuoxiaolong,多谢分享 GC策略解决了 ...

  8. 垃圾收集算法与垃圾收集器

    典型的垃圾收集算法 1.Mark-Sweep(标记-清除)算法 这是最基础的垃圾回收算法,之所以说它是最基础的是因为它最容易实现,思想也是最简单的.标记-清除算法分为两个阶段:标记阶段和清除阶段.标记 ...

  9. 深入理解java虚拟机之——垃圾回收(垃圾判断,垃圾收集算法,垃圾收集器)

    java与C++之间有一道动态内存分配和垃圾收集的"墙",墙里面的人想出来,墙外边的人想进去,或许只有骑在墙上才能清楚的了解,墙内墙外都是牢笼. 上面一句出自<深入理解jav ...

最新文章

  1. Delphi中的TreeView
  2. 结对-贪吃蛇游戏-开发过程
  3. 如何确保sublime text每次启动时不会自动打开以前打开的文档
  4. 42.angularJS自定义服务
  5. NBA TopShot中勒布朗·詹姆斯的数字收藏卡以4.75万美元售出
  6. 物联网核心安全系列——智能门锁安全问题
  7. wifi的web 认证。
  8. 传统营销与社会化营销的差距
  9. snprintf与sprintf的区别
  10. 管理感悟:正确认识自己的工作
  11. Linux实验报告一【 下载配置搜狗安装包16.04】
  12. shopex PHP Notice,Shopex系统配置文件config.php说明
  13. 用matlab读pcap文件,libpcap读取本地pcap文件
  14. 江苏2021高考成绩查询全省排名,2021江苏省地区高考成绩排名查询,江苏省高考各高中成绩喜报榜单...
  15. commit rollback操作产生undo和redo?
  16. AD19导出bom表的方法(按照元件不同数值分类,重点信息突出)
  17. 关于flash强制更新:早上上班,多台电脑提示未安装flash
  18. Dreamweaver 2020 安装教程
  19. 更适合运动的耳机,设计时尚轻巧好用,南卡Runner CC3上手
  20. RFLA: Gaussian Receptive Field based Label Assignment for Tiny Object Detection

热门文章

  1. sql sum嵌套查询+ group by
  2. 60. Leetcode 面试题 10.03. 搜索旋转数组 (二分查找-局部有序)
  3. pytorch线性模型的基础使用
  4. python 笔记:csv 读写
  5. pytorch笔记:搭建简易CNN
  6. Flink从入门到精通100篇(八)-美团点评是如何在 Flink平台建立 实时数仓的?
  7. 怎样更好地使用快捷键?
  8. Python入门100题 | 第078题
  9. Python编程基础:第五十二节 高阶函数High Order Functions
  10. 极速发展的饿了么订单系统架构演进--转