java基础笔记——清理:终结处理和垃圾回收

Java编程思想笔记记录——清理:终结处理和垃圾回收

一、
在Java程序中使用对象完成之后不用像C++程序那样处理内存的回收和释放,java有垃圾回收器负责回收无用对象占据的内存资源。
当然也有特殊情况, 假如对象并非通过使用new关键字获得的特殊内存区域(怎么获取特殊内存,特殊内存的实例???{主要发生在本地方法下面, 本地方法调用非Java代码 }),由于垃圾回收机制只知道释放那些经过new分配到的内存空间,所以垃圾回收器不清楚如何处理这些特殊内存,在Java类中允许定义 finalize() 方法,当垃圾回收器触发的时候,会调用 finalize() 方法 ,可以用 finalize() 来做一些清理工作。

  1. 对象可能不被垃圾回收。
  2. 垃圾回收并不等于“析构”。
  3. 垃圾回收只与内存相关。
  4. 垃圾回收和finalize()都是靠不住的,只要JVM还没有快到耗尽内存的地步,它是不会浪费时间进行垃圾回收。
    使用垃圾回收器的唯一原因:为程序回收不再使用的内存

二、垃圾回收技术
引用计数:
引用计数是一种简单的但是很慢的垃圾回收技术,每个对象都含有一个引用计数器,当有引用的连接对象的时候引用计数+1,当引用离开作用域或被置为空的时候计数-1,此过程会在整个程序的生命周期中持续进行。垃圾回收器会遍历全部对象的计数器,发现计数为0的时候会释放其内存空间。
当对象循环引用时可能会出现对象应被回收但计数器不为0的情况发生。对垃圾回收器来说,定位这样的对象需要的工作量很大。引用计数用来说明垃圾收集的工作机制。

在一些一些更快的模式中,垃圾回收器并不基于引用计数技术,他们依据的思想:

对任何“活”的对象,一定能最终追溯到期存活的在堆栈活静态存储区之中的引用。这条引用可能会穿过数个对象层次。
如果从堆栈和静态存储区开始,遍历所有的引用,就能找到所有活的对象。对于所有发现的引用必须追踪它所引用的对象,然后是此对象的所有的引用,如此反复,直到 “根源于堆栈和静态存储区的引用”所形成的网络全部被访问为止,你所有访问过的对象都必须是活的。

JVM将采用一种自适应的垃圾回收技术。

  1. 停止-复制(stop-and-copy)
    先暂停程序,然后将所有存活的对象从当前堆复制到另外一个堆,没有复制的全部是垃圾会被清理掉,对象被复制到新堆的时候,他们是一个挨着一个的,所以新堆是保持紧密排序的。
    效率降低的原因:
  • 需要两个堆对对象进行来回倒腾,维护比实际的空间要大一倍
  • 程序进入稳定状态后,只可能产生少量的垃圾,这样仍会对 对象进行复制
  1. 标记-清扫(make-and-sweep)
    思路是从堆栈和静态存储区出发,遍历所有的引用,从而找出所有存活的对象,会给对象做一个标记,这个过程不会回收任何一个对象。只有全部标记工作完成之后,清理工作才开始,清理过程中没有标记的对象将会被释放。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值