浅谈Java垃圾回收机制

今天来谈谈Java垃圾回收机制,为何谈这个呢?毕竟这个是Java的一大特色,也是进阶之路需要去深入了解的地方。学过C++的同学都知道,C++编程中,对象所占的内存在程序结束运行之前会一直被占用,在明确释放之前不能分配给其它对象。


而在Java中,如果没有对象引用指向原先分配给某个对象的内存时,该内存便成为垃圾。而负责编译的Java虚拟机-JVM的一个系统级线程则自动释放该内存块。垃圾的回收意味着程序不再需要的对象是垃圾信息,会被丢弃。这一设计很好地提高了资源利用,方便了空间被后来的新对象使用。学到一定程度的同学可以去看《深入理解Java虚拟机:JVM高级特性与最佳实践》,进行深入了解。

垃圾回收机制,顾名思义,所以该机制可以使得Java编程自动释放内存空间,减轻了编程的负担,同时,这也是Java语言安全性策略的一个重要部份。当然,凡是有利必有弊,由于Java虚拟机必须追踪运行程序中有用的对象,最终释放没用的对象。这一过程需要花费处理器的时间,同时也因为垃圾回收算法的不完备性,使得垃圾回收机制的开销影响了程序的性能。不过,由于机器的进步和算法的改进,这些问题会慢慢地被解决的。


一、垃圾回收机制具有以下的特点:
 
1、 垃圾回收机制只负责回收堆内存,不会回收任何物理资源
2、 程序无法精确控制垃圾回收的进行,会在合适的时候进行
3、 在垃圾回收机制回收的任何对象之前,总会先调用它的finalize()方法


需要强调的一点:垃圾回收回收的是无任何引用的对象占据的内存空间而不是对象本身


二、对象在内存中的状态




三、垃圾回收机制中的算法


Java并没有明确地说明JVM使用哪种垃圾回收算法,但是任何一种垃圾回收算法一般要做2件基本的事情:(1)发现无用信息对象;(2)回收被无用对象占用的内存空间,使该空间可被程序再次使用。


垃圾回收算法有很多种,如引用计数算法、可达性分析算法……我对JVM也没有过多的学习,所以这里也没法进行深入的探讨。


四、强制垃圾回收
强制系统垃圾回收有两种方式:
1、 调用System类的gc()静态方法:System.gc()
2、 调用Runtime对象的gc()实例:Runtime.getRuntime().gc()


强调:所谓强制回收,其实也仅仅是一个建议。JVM接受这个消息后,并不是立即做垃圾回收,而只是对几个垃圾回收算法做了加权,使垃圾回收操作容易发生,或提早发生,或回收较多而已。


五、finalize方法
为什么要使用这个方法呢?这是一个默认机制,当要回收某个内存之前,通常需要调用适当的方法来清理资源,而这个方法就是finalize方法。它的原型为:protected void finalize() throws Throwable。在finalize()方法返回之后,对象消失,垃圾收集开始执行。原型中的throws Throwable表示它可以抛出任何类型的异常。
  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值