📄 9_2_1 垃圾收集算法简介 - 《多任务下的数据结构与算法》 - 免费试读 - book_csdn_net.htm
字号:
+"<a href='http://club.book.csdn.net/people/myclub.aspx' target='_blank'>我的书架</a> "
+"<a href='http://passport.csdn.net/logonout.aspx' onclick='$mz_.logout(this); return false'>【注销】</a>"
})();
/*]]>*/</SCRIPT>
</DIV><!-- -->
<SCRIPT
src="9_2_1 垃圾收集算法简介 - 《多任务下的数据结构与算法》 - 免费试读 - book_csdn_net.files/urchin.js"
type=text/javascript>
</SCRIPT>
<SCRIPT type=text/javascript>
_uacct = "UA-178341-4";
urchinTracker();
</SCRIPT>
<!-- /公共页头 --><LINK
href="C:\Documents and Settings\K&G\桌面\9_2_1 垃圾收集算法简介 - 《多任务下的数据结构与算法》 - 免费试读 - book_csdn_net.files\style(1).css"
type=text/css rel=stylesheet>
<DIV id=booknav2>
<DIV id=booknavtop>
<UL>
<LI><A href="http://book.csdn.net/">首页</A> </LI>
<LI><A href="http://book.csdn.net/book/morelz.aspx">精品连载</A> </LI>
<LI><A href="http://club.book.csdn.net/people/myclub.aspx">我的书友会</A> </LI>
<LI><A href="http://club.book.csdn.net/people/putblog.aspx">图书秀</A> </LI>
<LI><A href="http://club.book.csdn.net/people/alllist.aspx">书架</A> </LI>
<LI><A href="http://blog.csdn.net/group/bookread/" target=_blank>圈子</A> </LI>
<LI><A href="http://down.csdn.net/app/list.php?tid=502" target=_blank>资源下载</A>
</LI>
<LI><A href="http://bank.csdn.net/" target=_blank><FONT
style="FONT-WEIGHT: bold">银行</FONT></A> </LI></UL></DIV>
<SCRIPT type=text/javascript>
function IsBlank(obj) //查看对象的值是否为空
{
if(obj.replace(/^\s+|\s+$/,"")=="")
{
return true;
}
else
{
return false;
}
}
function SearchBook_Top()
{
if( !IsBlank(document.getElementById("txtTopKey").value))
{
var loc;
var szType;
if(document.getElementById("listSearchType").value==null)
{
szType= document.getElementById("listSearchType").options(document.getElementById("listSearchType").selectedIndex).value;
}
else
{
szType= document.getElementById("listSearchType").value;
}
if(szType==1)
loc="http://book.csdn.net/book/morelz.aspx?key="+escape(document.getElementById("txtTopKey").value);
else
loc="http://club.book.csdn.net/book/s.aspx?key="+escape(document.getElementById("txtTopKey").value);
self.location=loc;
}
}
</SCRIPT>
<DIV id=booknavbottom2>
<DIV class=hotleft><A href="http://book.csdn.net/subject/allbook.htm"
target=_blank>全部图书</A> <FONT color=red>推荐</FONT>:<A
href="http://club.book.csdn.net/book/s.aspx?key=asp.net">ASP.NET</A> <A
href="http://club.book.csdn.net/book/s.aspx?key=ajax">Ajax</A> <A
href="http://club.book.csdn.net/book/s.aspx?key=spring">Spring</A> <A
href="http://club.book.csdn.net/book/s.aspx?key=Hibernate">Hibernate</A> <A
href="http://club.book.csdn.net/book/s.aspx?key=Java">Java</A></DIV>
<DIV class=hotright><SELECT id=listSearchType name=aa> <OPTION value=2
selected>书友会</OPTION> <OPTION value=1>连载</OPTION></SELECT><INPUT
onkeypress=if(event.keyCode==13){SearchBook_Top();} id=txtTopKey maxLength=25><INPUT onclick=SearchBook_Top(); type=button value=搜索 name=提交></DIV></DIV></DIV>
<DIV class=area>
<SCRIPT
src="9_2_1 垃圾收集算法简介 - 《多任务下的数据结构与算法》 - 免费试读 - book_csdn_net.files/BookDetailAd.js"
type=text/javascript></SCRIPT>
<DIV class=col1>
<DIV class=lineBlue></DIV><!-- title -->
<DIV class=arcTitle>
<H1><A href="http://book.csdn.net/bookfiles/65">多任务下的数据结构与算法 </A></H1>
<DIV style="FONT-SIZE: 15px; TEXT-ALIGN: center"><A
href="http://book.csdn.net/bookfiles/65/100652568.shtml">9.2.1 垃圾收集算法简介
</A></DIV>
<DIV style="FONT-SIZE: 15px; TEXT-ALIGN: center"><A class=url
href="http://book.csdn.net/">http://book.csdn.net/</A> 2006-8-14 14:19:00 </DIV>
<DIV class=clear></DIV>
<DIV
style="BORDER-RIGHT: #0b5f98 1px solid; BORDER-TOP: #0b5f98 1px solid; MARGIN: 0px auto; BORDER-LEFT: #0b5f98 1px solid; WIDTH: 700px; BORDER-BOTTOM: #0b5f98 1px solid">
<DIV
style="PADDING-RIGHT: 1px; PADDING-LEFT: 1px; FLOAT: left; PADDING-BOTTOM: 1px; WIDTH: 16px; COLOR: white; PADDING-TOP: 1px; BACKGROUND-COLOR: #0b5f98">图书导读
</DIV>
<DIV
style="PADDING-LEFT: 2px; FLOAT: right; WIDTH: 670px; LINE-HEIGHT: 16pt; TEXT-ALIGN: left"><!--导读-->
<H1 id=divCurrentNode
style="PADDING-LEFT: 2px; FONT-SIZE: 12px; WIDTH: 100%; COLOR: #b83507; TEXT-ALIGN: left">当前章节:<A
href="http://book.csdn.net/bookfiles/65/100652568.shtml"><FONT color=red>9.2.1
垃圾收集算法简介</FONT></A></H1>
<DIV id=divRelateNode style="PADDING-LEFT: 2px">
<DIV style="FLOAT: left; WIDTH: 49%">·<A
href="http://book.csdn.net/bookfiles/65/100652565.shtml">6.2.8
复合数据结构的分类</A></DIV>
<DIV style="FLOAT: right; WIDTH: 49%">·<A
href="http://book.csdn.net/bookfiles/65/100652566.shtml">8.6.1
线程池调度管理的基本概念</A></DIV>
<DIV style="FLOAT: left; WIDTH: 49%">·<A
href="http://book.csdn.net/bookfiles/65/100652567.shtml">8.6.2
线程池调度管理的编码实现</A></DIV>
<DIV style="FLOAT: right; WIDTH: 49%">·<A
href="http://book.csdn.net/bookfiles/65/100652569.shtml">9.2.2
用户层垃圾回收算法的实现</A></DIV>
<DIV style="FLOAT: left; WIDTH: 49%">·<A
href="http://book.csdn.net/bookfiles/65/100652570.shtml">9.2.3
多任务下的垃圾收集</A></DIV>
<DIV style="FLOAT: right; WIDTH: 49%">·<A
href="http://book.csdn.net/bookfiles/65/100652571.shtml">9.2.4
使用垃圾回收算法来做内存泄漏检查</A></DIV></DIV></DIV></DIV>
<DIV class=clear></DIV></DIV><!-- main -->
<DIV id=main>
<DIV id=text>
<DIV id=csdn_zhaig_ad_yahoo_2></DIV>
<H3 style="MARGIN-LEFT: 0cm; TEXT-INDENT: 0cm"><A name=_Toc122884879></A><SPAN
lang=EN-US>9.2.1</SPAN><SPAN lang=EN-US> </SPAN><SPAN
style="FONT-FAMILY: 方正准圆简体">垃圾收集算法简介</SPAN></H3>
<P class=MsoNormal><SPAN style="FONT-FAMILY: 华康简宋">目前,</SPAN><SPAN
lang=EN-US>C/C++</SPAN><SPAN
style="FONT-FAMILY: 华康简宋">语言的内存管理要求申请的内存必须由用户手工释放,如果用户没有进行手工释放就会造成内存泄漏,这对编程提出了很高的要求。特别是在一些有高可靠性要求的应用和服务器软件中,如果产生内存泄漏将严重影响软件的可用性,同时手工回收内存还大大增加了程序员的工作量。为了让分配的内存在不再使用时自动释放,产生了垃圾收集算法。</SPAN></P>
<P class=MsoNormal><SPAN
style="FONT-FAMILY: 华康简宋; LETTER-SPACING: 0.1pt">垃圾收集算法最早出现于</SPAN><SPAN
lang=EN-US style="LETTER-SPACING: 0.1pt">20</SPAN><SPAN
style="FONT-FAMILY: 华康简宋; LETTER-SPACING: 0.1pt">世纪</SPAN><SPAN lang=EN-US
style="LETTER-SPACING: 0.1pt">60</SPAN><SPAN
style="FONT-FAMILY: 华康简宋; LETTER-SPACING: 0.1pt">年代,到现在已经发展了几十年。由于</SPAN><SPAN
lang=EN-US style="LETTER-SPACING: 0.1pt">20</SPAN><SPAN
style="FONT-FAMILY: 华康简宋; LETTER-SPACING: 0.1pt">世</SPAN><SPAN
style="FONT-FAMILY: 华康简宋">纪</SPAN><SPAN lang=EN-US>90</SPAN><SPAN
style="FONT-FAMILY: 华康简宋">年代</SPAN><SPAN lang=EN-US>Java</SPAN><SPAN
style="FONT-FAMILY: 华康简宋">语言支持垃圾收集功能,使得垃圾收集算法被广大程序员所认识。现在许多语言如</SPAN><SPAN
lang=EN-US>Smalltalk</SPAN><SPAN
style="FONT-FAMILY: 华康简宋">等都拥有了垃圾收集的支持,对于</SPAN><SPAN
lang=EN-US>C/C++</SPAN><SPAN style="FONT-FAMILY: 华康简宋">,也出现了一些支持收集的库。</SPAN></P>
<P class=MsoNormal><SPAN style="FONT-FAMILY: 华康简宋">目前常见的垃圾收集算法有以下几种。</SPAN></P>
<H4 style="MARGIN-LEFT: 0cm"><SPAN lang=EN-US>1. </SPAN><SPAN
style="FONT-FAMILY: 黑体">引用计数算法</SPAN></H4>
<P class=MsoNormal><SPAN
style="FONT-FAMILY: 华康简宋">引用计数算法中,要给每一个动态分配的内存进行引用计数,也就是当每次对内存的引用增加时就加</SPAN><SPAN
lang=EN-US>1</SPAN><SPAN style="FONT-FAMILY: 华康简宋">,当取消对内存的引用时就减</SPAN><SPAN
lang=EN-US>1</SPAN><SPAN style="FONT-FAMILY: 华康简宋">,当引用计数变成</SPAN><SPAN
lang=EN-US>0</SPAN><SPAN
style="FONT-FAMILY: 华康简宋">时,表示内存没有被使用,内存就可以被回收了。</SPAN></P>
<P class=MsoNormal><SPAN style="FONT-FAMILY: 华康简宋">在</SPAN><SPAN
lang=EN-US>C/C++</SPAN><SPAN
style="FONT-FAMILY: 华康简宋">中,每次指针指向一块分配的内存时,就要将这块内存的引用计数加</SPAN><SPAN
lang=EN-US>1</SPAN><SPAN
style="FONT-FAMILY: 华康简宋">,增加了指针操作的开销。回收时相对而言非常简单,只要判断引用计数为</SPAN><SPAN
lang=EN-US>0</SPAN><SPAN
style="FONT-FAMILY: 华康简宋">就释放。这个算法的缺点是当有循环引用时,循环引用的内存块由于相互都有指针指向对方,因此它的引用计数必然大于等于</SPAN><SPAN
lang=EN-US>1</SPAN><SPAN style="FONT-FAMILY: 华康简宋">,导致无法将其释放。</SPAN></P>
<P class=MsoNormal><SPAN
style="FONT-FAMILY: 华康简宋">引用计数的一个很大优点就是实现起来非常容易,并且在没有编译器支持的情况下,在用户程序层也很容易实现。</SPAN></P>
<H4 style="MARGIN-LEFT: 0cm"><SPAN lang=EN-US>2. </SPAN><SPAN
style="FONT-FAMILY: 黑体">标志清扫算法</SPAN></H4>
<P class=MsoNormal><SPAN
style="FONT-FAMILY: 华康简宋">在实际内存中,所有分配的内存对象组成了一个或多个连通图,可以通过从根节点开始对图进行遍历,能遍历到的内存对象就是被使用的对象,无法遍历到的内存对象便是需要释放的对象。在</SPAN><SPAN
lang=EN-US>C/C++</SPAN><SPAN
style="FONT-FAMILY: 华康简宋">程序中,根节点就是程序中的指针变量等元素。标志清扫算法便是基于以上原理设计的,分为如下两个阶段进行。</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>1) </SPAN><SPAN
style="FONT-FAMILY: 华康简宋">先将所有被分配的内存对象设置为未标志状态,然后通过根节点直接或间接地进行遍历操作,将能遍历到的内存对象标志成正在使用状态。</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>2) </SPAN><SPAN
style="FONT-FAMILY: 华康简宋">遍历所有被分配的内存,如果处于未标志状态就将其释放掉。</SPAN></P>
<P class=MsoNormal><SPAN
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -