Hi! 我是小小,今天是本周的第六篇,本篇将会着重的讲解关于Java垃圾回收机制。

垃圾回收的意义

Java语言的显著特点就是引入了垃圾回收机制,使得C++程序猿最为头疼的内存管理问题就直接解决掉了。这使得Java程序猿编写代码的时候,不需要直接考虑内存管理,垃圾回收可以有效的防止内存泄露,有效的使用空闲的内存。

垃圾回收机制中的算法

垃圾回收,有以下几种算法,这里对这几种算法进行分别的阐述。

引用计数法

算法分析

引用计数法是垃圾收集中的早期方式,这种方法中,堆中的每个对象实例都会有一个引用计数,当一个对象被创建的时候,这种对象实例会被分配一个变量,该变量计数设置为1,单任何变量被赋值为这个对象引用的时候,计数将会加1,但是超过生命周期的时候,将会减少1,任何计数器为0的时候将会做垃圾回收,当一个实例进行垃圾回收的时候,其引用的任何对象实例引用将会减少1.

优缺点

优点:引用计数器可以很快的执行,但是在程序运行中,对程序需要不被长时间打断的实时环境比较友好。缺点:无法检测出循环引用,如果父对象有一个对子对象的引用,子对象反过来也会引用父对象,这样关系永远不可能为0.

tracing算法

根搜索算法

根搜索算法中,程序吧所有引用关系用一张图表示,从一个节点GC ROOT开始,寻找对应的引用节点,找到这个节点以后,继续寻找这个节点的引用节点,当所有的引用节点寻找完毕以后,剩余的节点被认为是没有引用的节点。

算法示意图

算法分析

标记-清除算法采用从根集合进行扫描,对存活的对象对象标记,标记完毕后,再扫描整个空间中未被标记的对象,进行回收,如上图所示。标记-清除算法不需要进行对象的移动,并且仅对不存活的对象进行处理,在存活对象比较多的情况下极为高效,但由于标记-清除算法直接回收不存活的对象,因此会造成内存碎片。

compacting算法

  标记-整理算法采用标记-清除算法一样的方式进行对象的标记,但在清除时不同,在回收不存活的对象占用的空间后,会将所有的存活对象往左端空闲空间移动,并更新对应的指针。

copying算法

该算法的提出是为了克服句柄的开销和解决堆碎片的垃圾回收。它开始时把堆分成 一个对象 面和多个空闲面, 程序从对象面为对象分配空间,当对象满了,基于copying算法的垃圾 收集就从根集中扫描活动对象,并将每个 活动对象复制到空闲面(使得活动对象所占的内存之间没有空闲洞),这样空闲面变成了对象面,原来的对象面变成了空闲面,程序会在新的对象面中分配内存。

generation算法

分代垃圾回收算法,分为几代。

年轻代

  1. 所有新生成对象首先会放入年轻代中,年轻代的目标就是尽可能的快速手机哪些生命周期短的对象。

  2. 新生代内存按照8:1:1的比例分为一个eden区和两个survivor(survivor0,survivor1)区。一个Eden区,两个 Survivor区(一般而言)。大部分对象在Eden区中生成。回收时先将eden区存活对象复制到一个survivor0区,然后清空eden区,当这个survivor0区也存放满了时,则将eden区和survivor0区存活对象复制到另一个survivor1区,然后清空eden和这个survivor0区,此时survivor0区是空的,然后将survivor0区和survivor1区交换,即保持survivor1区为空, 如此往复。

  3. 当survivor1区不足以存放 eden和survivor0的存活对象时,就将存活对象直接存放到老年代。若是老年代也满了就会触发一次Full GC,也就是新生代、老年代都进行回收

  4. 新生代发生的GC也叫做Minor GC,MinorGC发生频率比较高(不一定等Eden区满了才触发)

年老代

1.在年轻代中经历了N次垃圾回收后仍然存活的对象,就会被放到年老代中。因此,可以认为年老代中存放的都是一些生命周期较长的对象。

2.内存比新生代也大很多(大概比例是1:2),当老年代内存满时触发Major GC即Full GC,Full GC发生频率比较低,老年代对象存活时间比较长,存活率标记高。

持久代

用于保存静态文件,例如Java类,方法等等。

GC

新生代收集器使用的收集器:Serial、PraNew、Parallel Scavenge

老年代收集器使用的收集器:Serial Old、Parallel Old、CMS

Serial收集器(复制算法)

新生代单线程收集器,标记和清理都是单线程,优点是简单高效。

Serial Old收集器(标记-整理算法)

老年代单线程收集器,Serial收集器的老年代版本。

ParNew收集器(停止-复制算法)

新生代收集器,可以认为是Serial收集器的多线程版本,在多核CPU环境下有着比Serial更好的表现。

Parallel Scavenge收集器(停止-复制算法)

并行收集器,追求高吞吐量,高效利用CPU。吞吐量一般为99%, 吞吐量= 用户线程时间/(用户线程时间+GC线程时间)。适合后台应用等对交互相应要求不高的场景。

Parallel Old收集器(停止-复制算法)

Parallel Scavenge收集器的老年代版本,并行收集器,吞吐量优先

CMS(Concurrent Mark Sweep)收集器(标记-清理算法)

高并发、低停顿,追求最短GC回收停顿时间,cpu占用比较高,响应时间快,停顿时间短,多核cpu 追求高响应时间的选择

GC的执行机制

Scavenge GC

一般情况下,当新对象生成,并且在Eden申请空间失败时,就会触发Scavenge GC,对Eden区域进行GC,清除非存活对象,并且把尚且存活的对象移动到Survivor区。然后整理Survivor的两个区。

Full GC

对整个堆进行整理

Java有了GC同样会出现内存泄露问题

1.静态集合类像HashMap、Vector等的使用最容易出现内存泄露,这些静态变量的生命周期和应用程序一致,所有的对象Object也不能被释放,因为他们也将一直被Vector等应用着。2.各种连接,数据库连接,网络连接,IO连接等没有显示调用close关闭,不被GC回收导致内存泄露。

3.监听器的使用,在释放对象的同时没有相应删除监听器的时候也可能导致内存泄露。

关于作者

我是小小,双鱼座的程序猿,我们下期再见~bye

END

「 往期文章 」

教程 | 叮咚!答应你们的文件上传教程,到货了!

测试 | 测试:你会这些命令吗?

心酸 | Bean复制的几种框架对比,看完心酸

扫描二维码

获取更多精彩

小明菜市场

来源:网络(侵删)

图片来源:网络(侵删)

点个在看你最好看

垃圾回收 | Java垃圾回收,这杯咖啡,不仅好喝,而且实用!相关推荐

  1. Java咖啡馆---品味第一杯咖啡

      品味第一杯咖啡 一.注释与文档 之所以把Java注释和文档功能放在最前面介绍,是因为Java程序的理念使然--所谓兵马未动粮草先行. 几乎所有编程语言都提供在源代码中添加注释的功能,开发者通过注释 ...

  2. java垃圾回收机制算法分析

    原文参考:蚂蚁课堂余胜军老师. 垃圾回收机制概述 Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存 ...

  3. Java 垃圾回收机制算法分析

    垃圾回收机制算法分析 垃圾回收机制概述 垃圾回收简要过程 手动GC回收 finalize作用 内存泄露 如何防止内存泄露 垃圾回收机制算法 引用计数法 复制算法 标记清除算法 标记-压缩算法 分代收集 ...

  4. java垃圾回收理解与算法

    垃圾回收机制概述 Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存管理.由于有个垃圾回收机制,Ja ...

  5. 什么是 Java 垃圾回收器~

    什么是 Java 垃圾回收器 Java 垃圾回收器是 Java 虚拟机 (JVM) 的三个重要模块 (另外两个是解释器和多线程机制) 之一,为应用程序提供内存的自动分配 (Memory Allocat ...

  6. 假期三天,我肝了万字的Java垃圾回收,看完你还敢说不会?

    大家好,我是狂聊,上一篇已经把 Jvm 的运行区数据和类加载机制聊完了. 今天来说说 Java 垃圾回收,高频面试问题. 提纲附上,话不多说,直接干货 1.什么是垃圾回收? 垃圾回收(Garbage ...

  7. 安卓 java内存碎片_理解Android Java垃圾回收机制

    Jvm(Java虚拟机)内存模型 从Jvm内存模型中入手对于理解GC会有很大的帮助,不过这里只需要了解一个大概,说多了反而混淆视线. Jvm(Java虚拟机)主要管理两种类型内存:堆和非堆. 堆是运行 ...

  8. java中异常回收_理解Java垃圾回收

    当程序创建对象.数组等引用类型的实体时,系统会在堆内存中为这一对象分配一块内存,对象就保存在这块内存中,当这块内存不再被任何引用变量引用时,这块内存就变成垃圾,等待垃圾回收机制进行回收.垃圾回收机制具 ...

  9. java垃圾回收机制_笔记 | Java垃圾回收机制

    本文经授权转载自程序员杂货铺(ID:speakFramework) 垃圾回收 最近上海的小伙伴是不是要被强垃圾分类搞疯了???哈哈哈哈 上海是个走在前列的城市啊,不光骑自行车闯红灯要被罚钱,垃圾不分类 ...

最新文章

  1. matlab中ismember_相当于Matlab“ismember”in numpy(Python)?
  2. java冒泡排序函数验证_java冒泡排序-选择排序-插入排序-使用API中文文档直接调用函数...
  3. 量子计算竞速时代,如何拨动时间的指针
  4. linux 基因组数据下载,linux下用Aspera从NCBI上下载SRA格式宏基因组数据
  5. 计算星期c语言编码,[转载]计算任何一天是星期几的C语言源代码.
  6. android getdecorview 出现空指针,android – 为什么我从TabWidget得到一个空指针异常?...
  7. Linux操作系统中的路由表配置
  8. ENVI5.3.1使用Landsat 8影像进行预处理及分析实例操作
  9. 【信号处理】脉搏信号处理系统含Matlab源码
  10. 火车头采集html5游戏,火车头采集网站内页URL(图文)教程!
  11. 转!!以太网方案设计
  12. [渝粤教育] 西南科技大学 信息组织与检索 在线考试复习资料2021版
  13. Ubuntu kylin优麒麟下配置Hadoop环境
  14. amd显卡测试大风车软件md,肉眼可见的撕裂 AMD将推出FreeSync2 HDR测试工具
  15. 微星电脑不能u盘引导linux,微星电脑设置从U盘启动的三种方式
  16. 华为大搞5G光通信,火星人快步紧跟
  17. PR2019中对基本图形mogrt文件进行文件夹分类不再混乱
  18. php爬虫邮箱邮件,简单网络爬虫实现爬取网页邮箱
  19. 上升了百分之几怎么算_上涨百分之多少怎么算
  20. 计算机主机型号查询,如何查询电脑硬件的型号

热门文章

  1. BestCoder Round #87 1003 LCIS[序列DP]
  2. Firefox已阻止此网站安装未经验证的附加组件的解决办法
  3. User-Defined-Literal自定义字面量
  4. (素材源码) 猫猫学IOS(十二)UI之UITableView学习(上)LOL英雄联盟练习
  5. Java新手之Java 从代码到运行的过程
  6. 把女友升级为老婆的时候发生的BUG(二)
  7. 好用的对象转xml、xml转对象工具类-支持集合嵌套转换(Java实现)
  8. 思维导图系列之Java多线程知识梳理
  9. 你需要知道的基础算法知识——STL和基础数据结构(五)
  10. eclipse中安装spring Tool自动补全插件,命名空间