现代的虚拟运行时平台基本上都提供了垃圾回收的机制,其实垃圾回收是一个非常古老的技术,可以追溯到Lisp。

那么为什么要使用垃圾回收呢?这个要和显式的内存分配和释放相比较。我们或多或少的接触过或学习过这样的代码:

   1: struct Node{
   2:     ElementType Element;
   3:     Node* Next;
   4: }
   5:  
   6: Node* node = malloc(sizeof(Node));
   7:  
   8: //do something
   9:  
  10: free(node);

这里的malloc和free就是程序员显式的从堆上分配内存和释放不再使用的内存,将其归还给堆。这种让程序员控制内存的分配和释放有很大的灵活性,如果操作得当也非常高效。对于我上面写的这段代码我们都能很正确的写出分配和释放的代码。但是当项目越来越大,这种靠程序员自己分配和释放的机制就会带来一些问题,最典型的有下面两个:

1 我malloc了,但是忘记调用free。

这就是著名的内存泄露(memory leak)。表现的形式就是程序运行一段时间后所占的内存居高不下,只升不降。因为我们总是一味的去分配,而没有释放,甚至会出现out of memory错误。特别是对于那些长时间运行的应用(比如服务器端程序),内存泄露是致命的。可能有人要问,是你malloc的,你怎么就忘记free了呢?如果代码就寥寥数行,确实不容易出现这种问题,但是试想这样的情况:你在一个函数里使用malloc分配了一段内存,然后将指针作为返回参数返回给函数调用者,这个时候就很有可能忘记free了。

2 我已经free了,但是疏忽了,我还是使用了

这就是所谓的悬挂指针(hang pointer)。表现形式就是程序运行不稳定。有可能还得出错误的结果。

实际上最大的问题是,这两种错误都很难诊断。对于一般的bug,我们可以分析源代码,调试等手段很容易的得出。而这两种类型的bug,不仅需要借助一些专用的工具,还必须有耐心,就像守株待兔一样耐心的等待bug的出现。可想而知,那样的效率是如何低下。

为了将程序开发人员从这样的噩梦中拯救出来,现代的运行时都提供了各种各样的自动垃圾回收机制。

在具备自动垃圾回收机制的平台里,应用开发人员只管创建对象,垃圾回收器会帮你照料这些对象。垃圾回收器通过巧妙设计的算法发现那些不再被使用的对象(垃圾),然后将它们回收。

那么,既然垃圾回收机制如此美妙,而自己管理内存又有这么多问题,那是不是所有的编程平台都应该提供这种机制呢。

计算机里充斥着大量类似的权衡问题。很多机制都是一把双刃剑,我们需要知道它所适用的场景,而不应该发现它的好处就把它当做神灵。

由于内存资源并不是无限的,在程序运行过程中肯定会触发多次的垃圾回收。垃圾回收与应用程序一起(有可能是同时并行的运行)运行,肯定也要占用一定的系统资源。而且垃圾收集器线程工作时,基于某些原因还要停止当前应用程序中所有线程的执行(运行托管代码的线程),让垃圾收集器的线程干完事儿后再继续执行,这对于一些对实时性很高的应用来说是不能忍受的。

垃圾回收器所采用的策略也多种多样,比如对于.NET的有Workstation的,有Server的。对于Workstation又有Without concurrent和Concurrent的(在.NET 4.0中,已经被Backgourd所替代)。每种策略都有自己的特点,对某一方面有利,对另一方面则弱一些,所以要根据自己应用的特点选取合适的垃圾回收策略(这方面Java的可控性更高一些,可以调整很多参数进行优化)。

自动垃圾回收学习笔记-我们为什么需要自动垃圾回收相关推荐

  1. python自动保存图片_Python学习笔记:利用爬虫自动保存图片

    兴趣才是第一生产驱动力. Part 1 起先,源于对某些网站图片浏览只能一张一张的翻页,心生不满.某夜,冒出一个想法,为什么我不能利用爬虫技术把想看的图片给爬下来,然后在本地看个够. 由此经过一番初尝 ...

  2. 学习笔记【Java 虚拟机②】垃圾回收

    若文章内容或图片失效,请留言反馈.部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 总目录 学习笔记[Java 虚拟机①]内存结构 学习笔记[Java 虚拟机②]垃圾回收 学习笔记[Java ...

  3. CAS学习笔记五:SpringBoot自动/手动配置方式集成CAS单点登出

    本文目标 基于SpringBoot + Maven 分别使用自动配置与手动配置过滤器方式实现CAS客户端登出及单点登出. 本文基于<CAS学习笔记三:SpringBoot自动/手动配置方式集成C ...

  4. JVM学习笔记(二):垃圾回收、垃圾回收算法、垃圾回收器(Serial、Parallel、CMC、G1)、内存分配原则实战

    垃圾回收 一.判断对象是否可以被回收 1.引用计数计数法 内容:在对象中添加一个引用计数器,每当有一个地方引用它,计数器就加一:当引用失效时,计数器就减一:任何时刻计数器为零的对象都是不可能在被使用的 ...

  5. G1垃圾回收器学习笔记

    一.基础概念 垃圾回收器G1(也就是Garbage-First)是从JDK7 Update4 开始正式提供的,在多CPU和大内存服务器上对垃圾回收提供软实施目标和高吞吐量.它在并行和串行以及CMS G ...

  6. Apollo星火计划学习笔记——第七讲自动驾驶规划技术原理2

    文章目录 前言 1. 泊车系统介绍 1.1 泊车任务 1.2 关键 Use Cas--车位类型 1.3 关键 Use Cas--环境条件 1.4 泊车过程描述 1.5 泊车状态操作和用户接口定义 1. ...

  7. 【Spring学习笔记 四】Spring自动装配机制实践

    我们一般学习某个知识,一定会现有个较为复杂的配置让你理解其中的关系,这个配置清晰规整,但是可能会需要大量的配置,这个时候就会有约定大于配置的理论实现了,通过我们约定好的一致的名称,我可以少写很多对应关 ...

  8. 【Python】学习笔记总结5(Python垃圾回收及内存优化)

    文章目录 五.Python垃圾回收 1.引用计数(主) 2.GC负责的主要任务 3.标记-清除 4.引用计数不能回收的案例分析 5.分代收集 6.GC的阈值 7.GC垃圾回收自动触发机制 7.内存优化 ...

  9. JVM学习笔记之四:分代垃圾回收

    2019独角兽企业重金招聘Python工程师标准>>> 如图所示,在HotSpot虚拟机中共划分有三个代:年轻代(young generation),年老代(old generati ...

  10. Cocos2dx学习笔记(1) Ref类型数据 垃圾回收机制

    1.不调用autorelease()的情况 TestVO* vo = new TestVO();//未调用create()方法创建,没有执行过autorelease()vo->init();// ...

最新文章

  1. 這個日本味超濃的建築竟然是台灣的小學
  2. 关于c语言中合法的数值常量
  3. linux mysql安装教程 方大帝_discuz论坛出现Can not connect to MySQL server错误的解决方法...
  4. 计算机算法设计与分析 递归实现快速排序和随机化实现快速排序
  5. Metropolis 采样与蒙特卡洛算法
  6. 联想台式计算机编号怎么查,联想台式机主机编号怎么查询
  7. 车上控制器中英文对照
  8. 推荐大家一部好电影:当幸福来敲门
  9. 【SAP-CO】成本中心会计报表
  10. WXS:微信小程序版JavaScript
  11. Vue中获取当前点击元素的父元素、子元素、兄弟元素
  12. 将pdf文件压缩到指定大小
  13. Mycat读写分离、主从切换、分库分表的操作记录 https://www.cnblogs.com/kevingrace/p/9365840.html
  14. uboot2021.10-nandflash-3.initr_nand
  15. [CTFHub] 2021-第四届红帽杯网络安全大赛-Web-find_it
  16. oracle中句柄,释放句柄 – 提供7*24专业数据库(Oracle,SQL Server,MySQL等)恢复和Oracle技术服务@Tel:+86 13429648788 - 惜分飞...
  17. 2018华为软件精英挑战赛
  18. wifi共享精灵 强大的网络伴侣
  19. GBASE 8C——SQL参考 2 函数和操作符
  20. Java中带返回值的方法

热门文章

  1. Cockos REAPER 6 for Mac - 强大的数字音频工作站
  2. iOS底层探索之多线程(五)—GCD不同队列源码分析
  3. 音乐后期处理:音乐失真效果制作
  4. 利用redis做次数限制的小结
  5. 英国航空系统周末故障,可能会损失掉全年将近 3% 的利润
  6. java代码输出1到100的质数
  7. 5.VMware View 5.0安装与部署-安装view agent与模版
  8. 乔布斯:你须寻得所爱(转)
  9. Linux软件包管理器
  10. eclipse 中System.out快捷键设定