- 在线时间
- 0 小时
- 最后登录
- 2007-11-17
- 注册时间
- 2005-1-15
- 听众数
- 2
- 收听数
- 0
- 能力
- 0 分
- 体力
- 1102 点
- 威望
- 0 点
- 阅读权限
- 40
- 积分
- 400
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 132
- 主题
- 85
- 精华
- 0
- 分享
- 0
- 好友
- 0
升级   33.33% 该用户从未签到
|
< >) I0 X |" v4 c
<TABLE cellSpacing=0 cellPadding=0 width=582 border=0>
" b6 e! M( S8 p- A3 ~2 o6 m% ~ O
* Z6 n" G# U9 q) V3 A<TR>
2 h w5 Q$ f0 x# T* |& s, g<TD class=data>深入浅出谈垃圾的回收—Java 堆的管理</TD></TR>- q! ?5 |# f- e4 N" i
<TR>
% F, {' p8 o$ X3 r$ V<TD class=data>0 E! k, Y7 H- X; A. ?: K; m/ t
<TABLE cellSpacing=5 cellPadding=0 width="100%" border=0>
! S9 z, i1 R9 I2 E( w$ n: L1 s7 N) \
<TR>
! w5 C |% x. m/ ?5 _. i<TD>8 ?8 b6 P$ A. s4 y
<DIV align=right>作者:IT动力源</DIV></TD>
9 `' C: U, J1 f/ [( ]( S P. z<TD>. B k/ j8 Q$ g- `. L( w
<DIV align=center>来源:赛迪网</DIV></TD>, E; Q" S( f& m
<TD>6 y6 G, L2 d0 {$ n; T/ F
<DIV align=center>点击数:<br></DIV></TD># B5 B* r& m, ^* |, A
<TD>更新时间:2005-10-26</TD></TR></TABLE></TD></TR>
0 k" X+ ?: F8 l; W5 x6 }" r<TR>
7 z" D4 |; l. Q<TD class=data></TD></TR>
: |" I% h, p7 o! j4 @7 w<TR>
% R7 ~" u: b; }+ w<TD class=wenben>
4 d6 x( T! m; L' w; k# {<TABLE width="98%" align=center border=0>
: p+ l2 W- }3 ~- [% B
1 d2 S+ c1 W9 \$ P8 a# F<TR>
c' ^) G3 ^9 ^& Q, W<TD>) Y1 X7 }* K+ ?: l! @
<DIV class=news_content>5 T1 {& r9 u. p) b- I5 H2 Y
<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>- X9 A; ~, Y2 Z+ n# K# q
< >
4 f) _+ G' S g, I' _6 p7 P3 Y< >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>
. T/ f% R, l; ]! C7 ], f% F<CENTER><CCID_NOBR>) f! S! A) m1 w1 t3 K
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
. t- A% ]. B, h" X! V9 A8 t0 V4 ^0 y$ U4 r& i# }
<TR>! T" H" S4 |; B& F# [7 E0 \% f
<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>8 K, ~" _9 r( ~+ s$ L
< ><br><br>在这个例子中,一个新的对象被创建,由于它没有使用,所以该对象迅速地变为可达,程序编译后,执行命令: <br><br></P>
( }) B; F+ F1 d<CENTER><CCID_NOBR>- D) D* ?0 Z* B+ Z; l8 g7 f9 m
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>- y6 ~* x7 \" H5 E$ O8 ~3 A
8 J$ R' {5 a5 v& Q3 w<TR> i9 Y4 V" B# _8 m$ k
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6>< RE><CCID_CODE>Java -verbosegc testgc</CCID_CODE></PRE></TD></TR></TABLE></CCID_NOBR></CENTER>
; s1 H2 W& `2 W: z% `' _8 C( \4 e2 T+ P< ><br><br>后结果为: <br><br></P>* [1 `& c a! x& H2 B# c) q3 _
<CENTER><CCID_NOBR>2 w0 H9 v! N4 O2 l: H! S9 j! \' D+ T4 c
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>! j8 u, ]8 {6 h3 r4 h
' ^6 T) _4 Q7 C
<TR>
; c) @ I. K# Y& x5 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>. k/ ?# k% R- b; J# E: F. A; l
< ><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>/ `, b. i O; Y P
<CENTER><CCID_NOBR>
/ L; B `5 Z; Y" j, `<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>, F' N* X" N9 ^7 B$ d
, {% a# E; X. X9 ]8 D<TR>& ?' E* s- u1 v b6 f$ d r$ X6 J) M
<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>
/ a* L2 B- ?: x) z, O- I% }% N< ><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>
6 M& @$ g, S5 }% w3 j* V<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>
2 N" S7 I3 ?* R; e, `/ X1 s[此贴子已经被作者于2005-12-29 17:52:45编辑过] |
|