学习日记-垃圾回收

 -------android培训java培训、期待与您交流! ----------

垃圾回收

 

垃圾回收器的作用是查找和回收(清理)无用的对象。以便让JVM更有效的使用内存。
垃圾回收器的运行时间是不确定的,由JVM决定,在运行时是间歇执行的。虽然可以通过System.gc()来强制回收垃圾,但是这个命令下达后无法保证JVM会立即响应执行,但经验表明,下达命令后,会在短期内执行你的请求。JVM通常会感到内存紧缺时候去执行垃圾回收操作。
垃圾回收过于频繁会导致性能下降,过于稀疏会导致内存紧缺。这个JVM会将其控制到最好,不用程序员担心。但有些程序在短期会吃掉大量内存,而这些恐怖的对象很快使用结束了,这时候也许有必要强制下达一条垃圾回命令,这是很有必要的,以便有更多可用的物理内存。
通常来讲让对象符合回收条件为:
1、将无用对象赋值为null。
2、重新为引用变量赋值。
3、让相互联系的对象成为“岛”对象。
4、强制的垃圾回收System.gc()。
在执行回收之前程序会先调用finalize()方法,看对象是否可以变成可达状态。如果还是不可以就会执行回收。该方法每个对象都只会调用一次。
注意:垃圾回收是随机的。虽说是强制回收但是也只是建议系统回收。
下面请看以下的两个小例子:
public class finalizeTest
{
public boolean checkout = false.
public void checkIn(){
this.checkout = true.
}
public void finalize(){
if (checkout)
{
System.out.print("the erroe").
}
}
public static void main(String[] args)
{
finalizeTest test = new finalizeTest().
test.checkIn().
System.gc().
System.out.println("Hello World!").
}
}
 
  本来希望通过System.gc()命令来强制执行finalize()来处理清理事务,但它没有执行。只要main方法没执行完,永远都不会被回收。因为在main方法内 finalizeTest test = new finalizeTest(). 后的“System.gc().”是要求系统去回收垃圾。系统线程此时经过判断,发现test仍然引用着finalizeTest对象。所以,不会去回收test。
 
例子二:
public class TestGc{
public void finalize(){
System.out.print("the erroe").
}
public static void main(String[] args)
{
TestGc test = new TestGc().
test = new TestGc().
test = null.
System.gc().
System.out.println("Hello World!").
}
}
  test = null,让test失去了对new TestGc()的引用。new TestGc()对象没有任何人在引用。在你申请GC的时候,就被回收了。因为此时系统只运行你一个线程(还有其他后台辅助的)当然有空闲时间,于是立刻回收了你的。程序输出“the erroeHello World!”。
-------android培训java培训、期待与您交流! ----------
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值