垃圾回收机制和堆栈区别

垃圾回收机制和堆栈区别

ID:5553885

大小:41.00 KB

页数:7页

时间:2017-12-18

垃圾回收机制和堆栈区别_第1页
垃圾回收机制和堆栈区别_第2页
垃圾回收机制和堆栈区别_第3页
垃圾回收机制和堆栈区别_第4页
垃圾回收机制和堆栈区别_第5页
资源描述:

《垃圾回收机制和堆栈区别》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、记得部门老大曾经说过,java的垃圾回收机制对于java体系结构的学习非常重要。这里将阅读的一些文献整理总结出来,记述java的几种垃圾回收算法。垃圾回收算法有两个基本的问题:1.必须检测到垃圾对象。2.必须重新声明被垃圾对象占用的堆空间并且让堆空间可用。可达性(reachability)一个对象是可达的,当且仅当从可执行程序的根集开始有引用路径能访问该对象。根集(rootsset)包括:1.局部变量的对象引用,栈元素以及任何类变量的对象引用2.任何对象引用,如string3.任何传递给本地方法的对象引用4.JVM的运行时数据区的任何

2、部分引用记数(referencecounting)这是一种不使用根集的垃圾回收算法。基本思想是:当对象创建并赋值时该对象的引用计数器置1,每当对象给任意变量赋值时,引用记数+1;一旦退出作用域则引用记数-1。一旦引用记数变为0,则该对象可以被垃圾回收。引用记数有其相应的优势:对程序的执行来说,每次操作只需要花费很小块的时间。这对于不能被过长中断的实时系统来说有着天然的优势。但也有其不足:不能够检测到环(两个对象的互相引用);同时在每次增加或者减少引用记数的时候比较费时间。在现代的垃圾回收算法中,引用记数已经不再使用。追踪算法(trac

3、ing)基于根集的最基本算法。基本思想是:每次从根集出发寻找所有的引用(称为活对象),每找到一个,则对其做出标记,当追踪完成之后,所有的未标记对象便是需要回收的垃圾。追踪算法基于标记并清除.这个垃圾回收步骤分为两个阶段:在标记阶段,垃圾回收器遍历整棵引用树并标记每一个遇到的对象。在清除阶段,未标记的对象被释放,并使其在内存中可用。紧凑算法(compacting)在追踪算法中,每次被释放的对象会让堆空间出现碎片,这会使得内存的页面管理变得非常不稳定,可能在还有足够内存空间时就发生溢出,这对于本来就紧张的JVM内存资源来说是非常不利的。由

4、此出现了紧凑算法。基本思想是:在追踪算法进行垃圾回收的基础上,每次标记清扫时顺便将对象全部整理到内存的一端,这样每次分配内存时便都能从顺序的空间开始。每次更新时,对象句柄都指向实际的对象,所有参考他的引用都将通过参考对象句柄来得到对象的实际位置。拷贝算法(copying)这是另一种针对内存碎片的算法。基本思想是:将内存划分为两块,一块是当前正在使用;另一块是当前未用。每次分配时使用当前正在使用内存,当无可用内存时,对该区域内存进行标记,并将标记的对象全部拷贝到当前未用内存区,这是反转两区域,即当前可用区域变为当前未用,而当前未用变为当

5、前可用,继续执行该算法。拷贝算法需要停止所有的程序活动,然后开始冗长而繁忙的copy工作。这点是其不利的地方。分代算法(geneational)针对拷贝算法的不足,有的最新JVM采用了分代算法。其思想依据是:1.被大多数程序创建的大多数对象有着非常短的生存期。2.被大多数程序创建的部分对象有着非常长的生存期。简单拷贝算法的主要不足是它们花费了更多的时间去拷贝了一些长期生存的对象。分代算法的基本思想是:将内存区域分两块(或更多),其中一块代表年轻代,另一块代表老的一代。针对不同的特点,对年轻一代的垃圾收集更为频繁,对老代的收集则较少,每

6、次经过年轻一代的垃圾回收总会有未被收集的活对象,这些活对象经过收集之后会增加成熟度,当成熟度到达一定程度,则将其放进老代内存块中。分代算法很好的实现了垃圾回收的动态性,同时避免了内存碎片,是目前许多JVM使用的垃圾回收算法。适应算法(adaptive)其主要思想是:在不同的条件下采用不同的回收算法。即动态改变垃圾回收策略。该算法对于垃圾回收的适应性和灵活性有着非常好的调整。、内存分配方面:   堆:一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式是类似于链表。可能用到的关键字如下

7、:new、malloc、delete、free等等。   栈:由编译器(Compiler)自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。2、申请方式方面:   堆:需要程序员自己申请,并指明大小。在c中malloc函数如p1=(char*)malloc(10);在C++中用new运算符,但是注意p1、p2本身是在栈中的。因为他们还是可以认为是局部变量。   栈:由系统自动分配。例如,声明在函数中一个局部变量intb;系统自动在栈中为b开辟空间。3、系统响应方面:   堆:操作系统有一个记录空闲内存地址

8、的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序,另外,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。