- 在线时间
- 0 小时
- 最后登录
- 2007-11-17
- 注册时间
- 2005-1-15
- 听众数
- 2
- 收听数
- 0
- 能力
- 0 分
- 体力
- 1102 点
- 威望
- 0 点
- 阅读权限
- 40
- 积分
- 400
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 132
- 主题
- 85
- 精华
- 0
- 分享
- 0
- 好友
- 0
升级   33.33% 该用户从未签到
|
< >
1 d- w5 P5 a4 F, u H9 `<TABLE cellSpacing=0 cellPadding=0 width=582 border=0>* c! C& q B( k0 A) z" o
1 q6 |$ Z; b3 `, ]' j$ M( }
<TR>
3 |* f1 ?9 [; |/ s4 R<TD class=data>深入浅出谈垃圾的回收—Java 堆的管理</TD></TR>
: d/ e; X+ h6 M<TR>: q7 B! k* a- q4 @3 h5 h. `$ d0 c7 J
<TD class=data>
" x$ J- D! |& I3 o9 j Y1 F7 ?7 |& I<TABLE cellSpacing=5 cellPadding=0 width="100%" border=0>
$ X* W( z: r9 |& w' w& a: ]+ W* v8 X! v6 o
<TR>
2 H( q% a* Z; E& o1 X& e7 f, ?<TD>
0 `+ S/ B1 p: D1 c2 K9 o9 @<DIV align=right>作者:IT动力源</DIV></TD>
1 {; O# E9 K" X5 O% R0 @* y4 e& b- {<TD>1 C3 B; X$ j1 `! J+ H! _
<DIV align=center>来源:赛迪网</DIV></TD>
# X! [- C V! y<TD>3 X7 o, b( a3 T1 K
<DIV align=center>点击数:<br></DIV></TD>
5 H' ?# x! B# \. I. e: i _<TD>更新时间:2005-10-26</TD></TR></TABLE></TD></TR>+ f. K- R" Y; c6 k) k. x
<TR>
2 z% p4 k, h6 h* ]2 c<TD class=data></TD></TR>
) x; g$ q9 i1 x* c/ {/ t<TR>
- v! @! ?1 {1 p2 r" Q8 A: }<TD class=wenben>
# Z+ k* b/ d- Q3 L# c/ o# \<TABLE width="98%" align=center border=0>
" \ T7 J/ w2 W
( _& c1 G% R& s2 S4 V, E<TR>: V. v5 a, B. Z5 s# K
<TD>
1 w/ b# O W* Y$ e. H<DIV class=news_content>
0 c5 d3 i0 }0 {8 |# p# b; N<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>
* n3 M3 {! a2 f) A$ V< >! y1 A& A9 e1 z1 C: z" ]9 B4 f
< >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>9 b; B7 f$ _+ ]& Z
<CENTER><CCID_NOBR>, r* U4 U' H U. Q
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
" N" L2 O( z# ]: _. p3 L9 H; H" `- p
<TR>
. R$ i, O6 u& g0 d, A<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>, m$ x7 [/ X/ }" ?8 ]
< ><br><br>在这个例子中,一个新的对象被创建,由于它没有使用,所以该对象迅速地变为可达,程序编译后,执行命令: <br><br></P>2 A8 t9 m7 z0 X& o; E. ^
<CENTER><CCID_NOBR>
* r' t. [9 `" t& b H+ v<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>( g, Z, ^1 `0 f: O7 B5 D# ~2 O( N
6 x0 A9 g* g- X& G; `' E<TR>% K/ p8 ^# g0 f7 D; }
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6>< RE><CCID_CODE>Java -verbosegc testgc</CCID_CODE></PRE></TD></TR></TABLE></CCID_NOBR></CENTER>, J4 r. W: @. R/ p ?6 j. m
< ><br><br>后结果为: <br><br></P>
& v) G, U% D1 c<CENTER><CCID_NOBR>0 }, `4 C' Y1 w" ?
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>, b9 o$ n2 Z( {. P6 O: [
z$ `& k+ b8 S, T<TR>7 M- h9 r' @9 r1 ^( q
<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>
- Y! E3 _9 Z" G( s& j; h< ><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>
; @3 N4 C6 _/ d7 Y: `9 v$ z<CENTER><CCID_NOBR>/ `, `* m, I2 o
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
4 N' }: u( O ]# u* j. | a' q, R* k* n
9 D7 f% c3 N: B, ^- S& \# c U. \* ?<TR>
: h4 T- v/ H' c% \4 g2 ?. N<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>3 m1 B6 B8 [' {9 s) D( a
< ><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>( n, D- T5 M* V+ X% t! i, I1 U
<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>* l+ L" v1 s& x7 I
[此贴子已经被作者于2005-12-29 17:52:45编辑过] |
|