一、java不想c系语言那样,需要自己手动的将产生的垃圾回收,而是将运行时产生的垃圾交给JVM处理回收;
二、java中的垃圾回收器:
我们都知道,在java中JVM的内存模型主要分为堆,虚拟机栈,本地方法栈,方法区,程序计数器,垃圾回收器主要是负责对堆中产生的垃圾对象进行回收。而在堆中由于对象的生命周期不尽相同,又大致可分为新生代,老年代,因此垃圾回收器也分为新生代和老年代的垃圾回收器(young GC,monior GC;full GC)。
如图:连线之间的连个垃圾回收器可以配合使用;

三、垃圾回收器介绍:
介绍前说一下啥叫STW(stop the world):当执行垃圾回收器的线程在运行时,其他的工作线程必须暂停,这个事件就是STW。通俗点说就是在进行垃圾回收时,用户线程会处于暂停状态。
新生代收集器:
1、Serial:
这个收集器是最基本,历史最久的垃圾回收器,在JDK1.3之前是JVM的新生代唯一选择。他是一个使值算法单线程的收集器,这里的“单线程”的意思并不是他只会用一个CPU或者单一的线程去惊醒垃圾回收,而最主要的是,当他在进行垃圾回收时,其他的工作线程会暂停,也就是出现STW。
优点:简单高效,对于限定单个CPU的环境来说,由于没有线程交互的开销,,专心做垃圾回收可以获得最高的手机效率;
缺点:会造成STW,在用户不知情的情况下把用户的正常的执行的工作线程的全部暂停(这项工作其实是由虚拟机在后台自动发起和自动为完成的)
以Serial 和Serial Old 为例,工作执行示意图:

2、ParNew:
他是一个Serial的多线程的版本,处理使用多线程去执行垃圾的回收之外,其余的控制参数,收集的算法,STW,对象的分配规则,回收策略等都与Serial收集器是一样的。除了多线程执行垃圾惠州之外,其实相比较没有多少创新的地方,只不过有一个与性能没有关系的但是却至关重要的是,除了Serial收集器之外,只有他能悦CMS收集器(下面会将=讲到)组合使用。
以ParNew和Serial Old 为例,工作执行示意图:

3、Parallel Scavenge
parallel Scavenge 收集器和ParNew 一样,使用的都是复制算法,也是多线程并行执行垃圾的回收;但是他与ParNew和其他的收集器不同的是他的关注点。Parallel Scavenge 的关注点或者说目标是达到一个可控制的吞吐量。所谓的吞吐量就是,CPU运行用户程序代码的时间与CPU总的运行时间的比。因此也被称为“吞吐量优先”的收集器。
以Parallel Scavenge 和parallelOld 为例,工作执行示意图:

老年代收集器:
4、CMS:
在JDK1.5的时候,HotSpot推出在强交互应用中几乎可称为有划时代的意义的垃圾回收期,他就是CMS(Concurrent Mark Sweep ),他是一款真正意义上的并发收集器,第一次实现了垃圾回收线程和用户线程同时执行。是一种以获取最短回收停顿时间为目标的收集器,在很多基于B/S架构的系统上大量使用,这类系统服务重视服务器的响应速度,希望停顿的时间极短,从而给用户带来良好的体验。
从名字就知晓他是一款基于“标记—清除”算法的收集器,他的执行过程相较于其他的收集器较为复杂一点,整个过程分为4个步骤,如下:
1)、初始标记:标记GC Root能直接关联到的对象;
2)、并发标记:基于初始标记完成的标记对象开始并发的标记,也就是Root Tracing 的过程。
3)、重新标记:修正在并发标记期间,因用户程序的运行导致的一些变动标记。
4)、并发清除:根据标记的对象,并发的清除没有标记的垃圾对象。
优点:并发收集、低停顿;
缺点:
1)、CMS对CPU资源较为敏感;CMS默认启动的回收线程的数量为:(CPU数量+3)/4,因此对于CPU少的系统,可能会导致用户程序的执行速度降低。
2)、无法清浮动的垃圾;因为在并发清理垃圾的过程中,用户程序还是运行的,所以会产生垃圾对象,而这个时候CMS收集器就无法回收,而且因为在垃圾回收的阶段,用户程序也在运行,,即是还要预留一部分的内存空间给用户线程,因此CMS不想其他的收集器一样在等到老年代不够在执行收集,而是在默认的情况下当内存使用了68%就会进行回收,也可以通过参数(-XX:CMSInitatingOccupancyFraction的值来调参)。如果CMS运行期间预留的内存不够用户程序需求,就启动预案,使用Serial Old进行老年代的回收。
3)、造成内存碎片化。因为使用的是“标记—清除”算法

5、Serial Old:
看到名字就知道,他就是一个Serial收集器的老年代版本,同样也是一个单线程进行垃圾回收的收集器,使用了标记—整理算法,主要在Client模式下的虚拟机使用;在Server模式下时,主要有两大作用:1、在JDK1.5中配合 Paralegal Scavenge 收集器使用;2、座位CMS的后背预案,在发生 Concurrent Mode Failure 的时候使用(见CMS的介绍)。
以Serial 和Serial Old 为例,工作执行示意图:

6、Parallel Old:
Parallel Old 是Parallel Scavenge 的老年代版本,使用多线程和“标记—整理”算法进行垃圾回收,在JDK1.6开始提供的收集器。在注重吞吐量和CPU资源敏感的情况下,可以优先使用两者的组合。
以Parallel Scavenge 和parallelOld 为例,工作执行示意图:

四、新一代收集器:G1
G1收集器是目前最前沿的成果,是基于“标记—整理”算法实现的收集器,优点是:1)、不会造成内存空间碎片,这个特点对于长时间的引用系统来说是至关重要的,2)、可以非常精确的控制停顿时间,即是能够让使用者明确在一个时间单位为M毫秒的时间段内,消耗在垃圾回收的时间不超过N毫秒,这几乎是实时java(RTSJ)的垃圾回收器的特征了。
他不在向之前的垃圾回收器进行新生代和老年代的区分,而是将整个堆空间进行一块一块的固定大小的区域来进行管理并清除,并且跟踪这些区域里面的垃圾堆积程度,在后台维护一个有极限列表,每次根据允许的时间,优先回收垃圾最多的区域,区域划分及有优先级区域回收的特点,保证了G1回收器在有限的时间内可以获得最高的回收效率。

java的垃圾回收器相关推荐

  1. 深入理解Java虚拟机-垃圾回收器与内存分配策略

    本博客主要参考周志明老师的<深入理解Java虚拟机>第二版 读书是一种跟大神的交流.阅读<深入理解Java虚拟机>受益匪浅,对Java虚拟机有初步的认识.这里写博客主要出于以下 ...

  2. [Java基础]-- Java GC 垃圾回收器的分类和优缺点

    关于Java的垃圾回收器,一直是个头疼的问题,这里简要说明下分类和优缺点,供选择使用. 一.JVM GC 垃圾回收器类型 JVM的垃圾回收器大致分为六种类型: 1.串行:垃圾回收器 (Serial G ...

  3. java不同垃圾回收器_细述 Java垃圾回收机制→Types of Java Garbage Collectors

    本文非原创,翻译自Types of Java Garbage Collectors 在Java中为对象分配和释放内存空间都是由垃圾回收线程自动执行完成的.和C语言不一样的是Java程序员不需要手动写垃 ...

  4. 一文读懂Java七大垃圾回收器

    java和c++最大的不同就是java中不需要手动去回收对象,在运行时jvm会自动帮我们进行垃圾回收,接下来让我们揭开垃圾收集器的面纱 名词解释 并行:多条线程并行工作 并发:多个线程并发执行,但他们 ...

  5. Java虚拟机-垃圾回收器

    一.如何查看垃圾回收器 查看JVM的默认垃圾回收器,可以看出JDK8中UseParallelGC即Parallel Scavenge+Serial Old java -XX:+PrintCommand ...

  6. Java GC 垃圾回收器

    一.垃圾定位 没有引用指向的对象被称为垃圾.如何定位垃圾?一般有两种算法,引用计数法 Reference Count,和根可达算法 Root Searching. 1.引用计数法 在对象上标记被指向的 ...

  7. Java -GC 垃圾回收器

    GC 垃圾回收器: 简介:GC 垃圾回收器是 JVM 中自动内存管理机制的具体实现,在 HotSpot 虚拟机中 GC 的工作主要划分为两 大类,分别是内存动态分配和垃圾回收,在内存执行分配之前,GC ...

  8. [JVM 相关] Java 新型垃圾回收器(Garbage First,G1)

    回顾传统垃圾回收器 HotSpot 垃圾收集器实现 Serial Collector(串型收集器) 使用场景,大多数服务器是单核CPU. 适用收集场景:1. 新生代收集(Young Generatio ...

  9. 【java】java 新一代垃圾回收器ZGC的探索与实践

    1.概述 转载:新一代垃圾回收器ZGC的探索与实践

最新文章

  1. c primer plus 5 读书笔记1
  2. 我所犯的JavaScript引用错误
  3. 网络编程(原始套接字)
  4. 怎么用python扫描主机_python扫描主机开放的端口
  5. 微服务模式下,实现前后端多资源服务调用
  6. 一个励志PM小哥哥的Java转型之路
  7. SO_REUSEADDR SO_REUSEPORT 解析
  8. 太原理工微型计算机控制试卷,太原理工大学微机原理考试(13届葬仪落整理).docx...
  9. C# 6.0 的新语法特性
  10. python装饰器函数执行后日志_python 某一函数上面有多个装饰器
  11. sed 多行替换,多行模式处理字符串;一次替换
  12. delphi2007不使用msbuild的方法
  13. SQL优化工具SQLAdvisor使用(转)
  14. 学计算机穿格子衬衫的男人,教你成为穿格子衬衫的帅气理工男
  15. VSCode Markdown 插件
  16. 给自己一个618消费的理由 飞利浦B8905回音壁有料分享
  17. 民宿平台airbnb是如何动态定价的
  18. 在html文件中以下使用绝对路径表示的是,JavaWeb——HTML5常用知识点
  19. 一文搭建Vuepress博客/文档系统:搭建,导出,SEO,自动编译和部署,域名,HTTPS,备案等
  20. java jtextarea 滚动条_Java Swing JTextArea自动添加滚动条

热门文章

  1. FBP中的滤波器设计
  2. 【力扣每日一题】691. 贴纸拼词
  3. Office 2016专业增强版报错1935“安装失败,正在回滚更改”解决方案
  4. ios AppStore 上架流程(Xcode11.5)
  5. python提供两个对象身份比较操作符是_Python提供了对象身份比较操作符( )测试两个变量是否指向同一个对象。_学小易找答案...
  6. 第二章 VUE数据绑定和渲染(1)
  7. 动态仙人掌 系列题解之三——3466: 动态仙人掌 III
  8. SAP:SWITCH用法
  9. linux创建软连接、删除软连接、修改软连接
  10. 统信UOS安装Intel I219-LM 网卡