首页 > 代码库 > 关于垃圾回收的一些基本原理及技术解析
关于垃圾回收的一些基本原理及技术解析
关于垃圾回收的一些基本原理及技术解析
什么是垃圾,为什么要垃圾回收?
垃圾回收是很大一块,在java虚拟机一些资料描述中,jvm大致干三件大事儿,1>加载class 2>分配存储空间 3>执行垃圾回收;可见垃圾回收在高级语言中所占的分量。(不好意思,扯远了~),简单点儿说就是:在程序运行时刻,产生的一直未能删除的或不能被引用的对象数据称之为垃圾,如果一直未能通过有效的方式回收会导致内存泄露(通俗点就是内存撑爆了).
关于人工回收的一些问题:
在C或C++语言中,程序员可显示地安排数据回收,当然在理想的情况下 任何不会再被访问的的存储都应该会被删除,同样,任何可能还会被引用的存储对象都不能被删除。但事实上,由于本身的回收困难之处以外还存在不少技术难点。简单点儿说就是 A>如果一直未能删除不能被引用的内存数据会使0内存占用过大,导致内存泄露 B>如果程序引用了一个已经被删除(回收的)的数据 会导致空指针引用
垃圾回收的一般要求:
基本要求是类型安全,但不是所有语言都适合进行自动垃圾回收。为了使垃圾回收器正常工作,它必须知道给定的数据元素或元素的分量(是否或可用作)一个指向某块已分配存储空间的指针。但是数据元素或分量在一些高级语言中又是类型不安全的,比如在C或C++中可以对存储地址进行任意操作。
垃圾回收的性能代价:
A>运行时间: 垃圾回收的速度可能较慢,容易增加一个应用程序的总运行时间
B>存储空间使用 需要避免内存碎片,极大地利用可用内存空间
C>停顿时间 垃圾回收过程会在没有任何预警的情况下突然启动,导致应用程序突然停顿,所以缩小停顿时间很重要
D>程序局部性 由于垃圾回收控制了数据的放置,因此影响了将要执行的代码的数据局部性。此时需要通过释放或复用空间改善时间局部性,通过重新放置移动一起使用的数据改善空间局部性
垃圾回收的一般方法:
垃圾回收分为:A>基于引用计数的垃圾回收 B>基于跟踪的垃圾回收 C>短停顿式垃圾回收
引用式的垃圾回收:
概述:对应每个对象都维护一个对象的引用计数,当计数为0的时候,该对象会被确认为垃圾随即被删除。
缺点:它不能回收不可达的循环数据结构,因为每次引用赋值都会增加一个额外运算,遂开销比较大。
跟踪的垃圾回收:
概述:标记所有可达对象并移入空闲列表,然后清扫整个堆区,此类型的垃圾回收会周期地(空闲空间耗尽或空闲空间低于某个阀值时)运行
缺点:很难找到堆区的不可达对象,导致清扫的代价较大,清扫时程序会全面停顿
短停顿式垃圾回收:
概述:每次只做部分垃圾回收工作,从而减少一次停顿的长度,按时间(增量式回收)或空间(部分式回收)分割回收任务
缺点:增量式垃圾回收在回收之后会留下漂浮垃圾,部分式垃圾回收会造成停顿较长或回收无效垃圾
原创博客,转载请注明出处:http://cnblogs.com/funnyzpc
关于垃圾回收的一些基本原理及技术解析