自动垃圾回收学习笔记-我们为什么需要自动垃圾回收
现代的虚拟运行时平台基本上都提供了垃圾回收的机制,其实垃圾回收是一个非常古老的技术,可以追溯到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的可控性更高一些,可以调整很多参数进行优化)。
自动垃圾回收学习笔记-我们为什么需要自动垃圾回收相关推荐
- python自动保存图片_Python学习笔记:利用爬虫自动保存图片
兴趣才是第一生产驱动力. Part 1 起先,源于对某些网站图片浏览只能一张一张的翻页,心生不满.某夜,冒出一个想法,为什么我不能利用爬虫技术把想看的图片给爬下来,然后在本地看个够. 由此经过一番初尝 ...
- 学习笔记【Java 虚拟机②】垃圾回收
若文章内容或图片失效,请留言反馈.部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 总目录 学习笔记[Java 虚拟机①]内存结构 学习笔记[Java 虚拟机②]垃圾回收 学习笔记[Java ...
- CAS学习笔记五:SpringBoot自动/手动配置方式集成CAS单点登出
本文目标 基于SpringBoot + Maven 分别使用自动配置与手动配置过滤器方式实现CAS客户端登出及单点登出. 本文基于<CAS学习笔记三:SpringBoot自动/手动配置方式集成C ...
- JVM学习笔记(二):垃圾回收、垃圾回收算法、垃圾回收器(Serial、Parallel、CMC、G1)、内存分配原则实战
垃圾回收 一.判断对象是否可以被回收 1.引用计数计数法 内容:在对象中添加一个引用计数器,每当有一个地方引用它,计数器就加一:当引用失效时,计数器就减一:任何时刻计数器为零的对象都是不可能在被使用的 ...
- G1垃圾回收器学习笔记
一.基础概念 垃圾回收器G1(也就是Garbage-First)是从JDK7 Update4 开始正式提供的,在多CPU和大内存服务器上对垃圾回收提供软实施目标和高吞吐量.它在并行和串行以及CMS G ...
- Apollo星火计划学习笔记——第七讲自动驾驶规划技术原理2
文章目录 前言 1. 泊车系统介绍 1.1 泊车任务 1.2 关键 Use Cas--车位类型 1.3 关键 Use Cas--环境条件 1.4 泊车过程描述 1.5 泊车状态操作和用户接口定义 1. ...
- 【Spring学习笔记 四】Spring自动装配机制实践
我们一般学习某个知识,一定会现有个较为复杂的配置让你理解其中的关系,这个配置清晰规整,但是可能会需要大量的配置,这个时候就会有约定大于配置的理论实现了,通过我们约定好的一致的名称,我可以少写很多对应关 ...
- 【Python】学习笔记总结5(Python垃圾回收及内存优化)
文章目录 五.Python垃圾回收 1.引用计数(主) 2.GC负责的主要任务 3.标记-清除 4.引用计数不能回收的案例分析 5.分代收集 6.GC的阈值 7.GC垃圾回收自动触发机制 7.内存优化 ...
- JVM学习笔记之四:分代垃圾回收
2019独角兽企业重金招聘Python工程师标准>>> 如图所示,在HotSpot虚拟机中共划分有三个代:年轻代(young generation),年老代(old generati ...
- Cocos2dx学习笔记(1) Ref类型数据 垃圾回收机制
1.不调用autorelease()的情况 TestVO* vo = new TestVO();//未调用create()方法创建,没有执行过autorelease()vo->init();// ...
最新文章
- 這個日本味超濃的建築竟然是台灣的小學
- 关于c语言中合法的数值常量
- linux mysql安装教程 方大帝_discuz论坛出现Can not connect to MySQL server错误的解决方法...
- 计算机算法设计与分析 递归实现快速排序和随机化实现快速排序
- Metropolis 采样与蒙特卡洛算法
- 联想台式计算机编号怎么查,联想台式机主机编号怎么查询
- 车上控制器中英文对照
- 推荐大家一部好电影:当幸福来敲门
- 【SAP-CO】成本中心会计报表
- WXS:微信小程序版JavaScript
- Vue中获取当前点击元素的父元素、子元素、兄弟元素
- 将pdf文件压缩到指定大小
- Mycat读写分离、主从切换、分库分表的操作记录 https://www.cnblogs.com/kevingrace/p/9365840.html
- uboot2021.10-nandflash-3.initr_nand
- [CTFHub] 2021-第四届红帽杯网络安全大赛-Web-find_it
- oracle中句柄,释放句柄 – 提供7*24专业数据库(Oracle,SQL Server,MySQL等)恢复和Oracle技术服务@Tel:+86 13429648788 - 惜分飞...
- 2018华为软件精英挑战赛
- wifi共享精灵 强大的网络伴侣
- GBASE 8C——SQL参考 2 函数和操作符
- Java中带返回值的方法