- 在线时间
- 0 小时
- 最后登录
- 2007-11-17
- 注册时间
- 2005-1-15
- 听众数
- 2
- 收听数
- 0
- 能力
- 0 分
- 体力
- 1102 点
- 威望
- 0 点
- 阅读权限
- 40
- 积分
- 400
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 132
- 主题
- 85
- 精华
- 0
- 分享
- 0
- 好友
- 0
升级   33.33% 该用户从未签到
|
< >
, F- O, @- G# X& v" V. I6 O' ~<TABLE cellSpacing=0 cellPadding=0 width=582 border=0>
2 p% z ?% f. x' {2 P8 X2 l7 R; d0 C, [, D! z6 ^7 |
<TR>
8 Q9 G; \0 m$ h6 [; L% J<TD class=data>深入浅出谈垃圾的回收—Java 堆的管理</TD></TR>' P, e/ o0 O7 R( r6 l
<TR>1 H' q6 _: K: R- W( M" _9 P( q! p
<TD class=data>/ D2 g* ~+ M4 H$ f
<TABLE cellSpacing=5 cellPadding=0 width="100%" border=0>
1 Y( w" Z! m3 @& w7 x8 U# Z% Q; }- b8 R/ y2 J
<TR>3 p& p0 V3 n A/ p5 M) V. R E
<TD>
/ F8 f# t/ S* h! R, J+ S, Z<DIV align=right>作者:IT动力源</DIV></TD>
& h( M7 g4 ~) v9 I A! j<TD>
* b6 k4 B# a# C: S<DIV align=center>来源:赛迪网</DIV></TD>
# `) K! S# A. O, ?$ i( ~<TD>- a- _$ P& r$ `& h
<DIV align=center>点击数:<br></DIV></TD>
, U' n) n$ U. p! C<TD>更新时间:2005-10-26</TD></TR></TABLE></TD></TR>
3 v' i9 ^( ]8 l/ A" @<TR>
& E4 D' Y: [& p2 c' @0 W<TD class=data></TD></TR>
" R- N% i2 X" E( F7 D, c<TR>
6 q5 H5 J2 I6 K; ?$ Q8 l+ E# S/ `$ A0 |<TD class=wenben>' L! [2 b; N3 X: }( P/ ?. E
<TABLE width="98%" align=center border=0>
; ^& x: o1 @2 G t1 P/ i: q9 c, L% o" @. I5 J- u4 H% _; E
<TR>
2 c& E" u U7 H* E<TD>
' o: d8 b3 m6 x<DIV class=news_content>: [5 i) d1 U+ G5 a" {
<CENTER><a href="http://www.itzero.net/Article/J2EE/2005_10/3520.html" target="_blank" >上一页</A> 第 <a href="http://www.itzero.net/Article/J2EE/2005_10/3520.html" target="_blank" >1</A> <B>2</B> <a href="http://www.itzero.net/Article/J2EE/2005_10/3520_3.html" target="_blank" >3</A> 页 <a href="http://www.itzero.net/Article/J2EE/2005_10/3520_3.html" target="_blank" >下一页</A></CENTER><br></STRONG>( F. y F4 ]2 P0 Q
< >
$ c' O0 q1 Q8 H< >5、generation算法(generational collector)<br><br>stop-and-copy垃圾收集器的一个缺陷是收集器必须复制所有的活动对象,这增加了程序等待时间,这是coping算法低效的原因。在程序设计中有这样的规律:多数对象存在的时间比较短,少数的存在时间比较长。因此,generation算法将堆分成两个或多个,每个子堆作为对象的一代(generation)。由于多数对象存在的时间比较短,随着程序丢弃不使用的对象,垃圾收集器将从最年轻的子堆中收集这些对象。在分代式的垃圾收集器运行后,上次运行存活下来的对象移到下一最高代的子堆中,由于老一代的子堆不会经常被回收,因而节省了时间。<br><br>6、adaptive算法(adaptive collector)<br><br>在特定的情况下,一些垃圾收集算法会优于其它算法。基于adaptive算法的垃圾收集器就是监控当前堆的使用情况,并将选择适当算法的垃圾收集器。<br><br>透视Java垃圾回收<br><br>1、命令行参数透视垃圾收集器的运行<br><br>使用system.gc()可以不管Jvm使用的是哪一种垃圾回收的算法,都可以请求Java的垃圾回收。在命令行中有一个参数-verbosegc可以查看Java使用的堆内存的情况,它的格式如下:<br><br>Java -verbosegc classfile可以看个例子:<br><br></P>& b7 I4 _# X7 S6 e: p
<CENTER><CCID_NOBR>
4 C1 a5 S8 N" h" r& ^<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>, U+ Z0 Q! H2 j; y, w+ P$ ~; |: }
' m# l, [; N3 @( Z, e9 e<TR>6 I9 @0 u3 z. e; _8 L7 i: {
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6>< RE><CCID_CODE>class testgc <br>{<br> public static void main(string[] args) <br> {<br> new testgc();<br> system.gc();<br> system.runfinalization();<br> }<br>}</CCID_CODE></PRE></TD></TR></TABLE></CCID_NOBR></CENTER>
3 C. [) Z/ u, W% C& g< ><br><br>在这个例子中,一个新的对象被创建,由于它没有使用,所以该对象迅速地变为可达,程序编译后,执行命令: <br><br></P>; F, r# N% u1 i* W
<CENTER><CCID_NOBR>
2 n- c1 F6 T" f$ i/ a4 g<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
4 F+ N8 L' [) M3 F" y, X% V( B) O( ^
+ O5 j& t1 s# k0 S3 q/ d<TR>
2 }1 N S( X2 i1 Z' z* U1 U<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6>< RE><CCID_CODE>Java -verbosegc testgc</CCID_CODE></PRE></TD></TR></TABLE></CCID_NOBR></CENTER>
9 V1 [1 s; `3 @4 J< ><br><br>后结果为: <br><br></P>
* T# q8 ]3 w3 O. v" p! ^+ Y<CENTER><CCID_NOBR>
I) c/ w7 h% x. R/ r9 Z2 ?) M$ p<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>; J/ `9 L( H2 q& [! f8 l4 [) G
# E" F, |' q& Y# [' Y<TR>
- H# }8 w- \4 J' s<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6>< RE><CCID_CODE>[full gc 168k->97k(1984k), 0.0253873 secs]</CCID_CODE></PRE></TD></TR></TABLE></CCID_NOBR></CENTER>. r& @+ B4 ?$ h9 I
< ><br><br>机器的环境为,windows 2000 Jdk1.3.1,箭头前后的数据168k和97k分别表示垃圾收集gc前后所有存活对象使用的内存容量,说明有168k-97k=71k的对象容量被回收,括号内的数据1984k为堆内存的总容量,收集所需要的时间是0.0253873秒(这个时间在每次执行的时候会有所不同)。 <br><br>2、finalize方法透视垃圾收集器的运行 <br><br>在Jvm垃圾收集器收集一个对象之前,一般要求程序调用适当的方法释放资源,但在没有明确释放资源的情况下,Java提供了缺省机制来终止化该对象心释放资源,这个方法就是finalize()。它的原型为: <br><br></P>/ ]5 Z0 x! B0 s
<CENTER><CCID_NOBR>+ y: o0 d3 U" E0 W- ?- q& [' R
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>9 o, v5 Q# S% m7 A ?! g" s
% O0 N! W7 l9 e3 }! _<TR>% ^* x! O& d( e* B- @7 H
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6>< RE><CCID_CODE>protected void finalize() throws throwable</CCID_CODE></PRE></TD></TR></TABLE></CCID_NOBR></CENTER>
1 E- W1 W/ l* ?* \' Z# @* P< ><br><br>在finalize()方法返回之后,对象消失,垃圾收集开始执行。原型中的throws throwable表示它可以抛出任何类型的异常。之所以要使用finalize(),是由于有时需要采取与Java的普通方法不同的一种方法,通过分配内存来做一些具有c风格的事情。这主要可以通过固有方法来进行,它是从Java里调用非Java方法的一种方式。c和c++是目前唯一获得固有方法支持的语言。但由于它们能调用通过其他语言编写的子程序,所以能够有效地调用任何东西。 <br><br>在非Java代码内部,也许能调用c的malloc()系列函数,用它分配存储空间。而且除非调用了free(),否则存储空间不会得到释放,从而造成内存漏洞的出现。当然,free()是一个c和c函数,所以我们需要在finalize()内部的一个固有方法中调用它。也就是说我们不能过多地使用finalize(),它并不是进行普通清除工作的理想场所。 <br><br>在普通的清除工作中,为清除一个对象,那个对象的用户必须在希望进行清除的地点调用一个清除方法。这与c 破坏器的概念稍有抵触。在c 中,所有对象都会破坏(清除)。或者换句话说,所有对象都应该破坏。若将c 对象创建成一个本地对象,比如在堆栈中创建(在Java中是不可能的),那么清除或破坏工作就会在结束花括号所代表的、创建这个对象的作用域的末尾进行。若对象是用new创建的(类似于Java),那么当程序员调用c 的delete命令时(Java没有这个命令),就会调用相应的破坏器。若程序员忘记了,那么永远不会调用破坏器,我们最终得到的将是一个内存漏洞,另外还包括对象的其他部分永远不会得到清除。 <br><br>相反,Java不允许我们创建本地(局部)对象,无论如何都要使用new。但在Java中,没有delete命令来释放对象,因为垃圾收集器会帮助我们自动释放存储空间。所以如果站在比较简化的立场,我们可以说正是由于存在垃圾收集机制,所以Java没有破坏器。然而,随着以后学习的深入,就会知道垃圾收集器的存在并不能完全消除对破坏器的需要,或者说不能消除对破坏器代表的那种机制的需要(而且绝对不能直接调用finalize(),所以应尽量避免用它)。若希望执行除释放存储空间之外的其他某种形式的清除工作,仍然必须调用Java中的一个方法。它等价于c 的破坏器,只是没后者方便。下面这个例子向大家展示了垃圾收集所经历的过程,并对前面的陈述进行了总结。 <br><STRONG><br><br>
4 g/ ~) O- T: b2 w6 k4 P<CENTER><a href="http://www.itzero.net/Article/J2EE/2005_10/3520.html" target="_blank" >上一页</A> 第 <a href="http://www.itzero.net/Article/J2EE/2005_10/3520.html" target="_blank" >1</A> <B>2</B> <a href="http://www.itzero.net/Article/J2EE/2005_10/3520_3.html" target="_blank" >3</A> 页 <a href="http://www.itzero.net/Article/J2EE/2005_10/3520_3.html" target="_blank" >下一页</A></CENTER></STRONG></DIV></TD></TR></TABLE></TD></TR></TABLE></P>
& Y3 W$ f g' t8 p1 o[此贴子已经被作者于2005-12-29 17:52:45编辑过] |
|