Java清理:垃圾回收

finalize()方法

工作原理

一旦垃圾回收器准备好释放对象占用的存储空间,首先调用finalize()方法,并且在下一次垃圾回收动作发生时,才会真正回收对象的内存。

要点
  1. 对象可能不被垃圾回收。
  2. 垃圾回收不等于析构。(C++中销毁对象必须使用析构函数,且对象一定会被销毁。)
  3. 垃圾回收只与内存有关。

垃圾回收器

存储空间的释放会影响存储空间的分配—-某些Java虚拟机的工作方式。

引用计数器
  1. 每个对象都有一个引用计数器。
  2. 引用接至对象,计数+1
  3. 引用离开作用域或被置为null,计数-1
  4. 垃圾回收期会在含有全部对象的列表上遍历,当某个计数为0.释放器占用空间。
  5. 如果对象之间存在循环引用,会出现“对象应该被回收,但引用计数却不为0”.
  6. 这是说明垃圾手机的工作方式,但是未被应用任何一种Java虚拟机中。
“活”的对象

对于任何活的对象,一定能追溯其存货在堆栈或静态存储区之中的引用。遍历所有引用,找到所有活的对象。
解决“交互自引用的对象组”的问题,这种现像根本不会被发现,因此被自动回收。

自适应垃圾回收技术

停止-复制
  1. 暂停程序的运行,然后将所有存活的对象从当前堆复制到行对保持紧凑排列,然后进行重新分配新空间。
  2. 所有的引用都被修正,位于堆或静态区的直接被修正,其他引用,遍历过程中才能被找到(旧地址映射到新地址)
  3. 维护比实际需要多一倍的空间,适用于大块内存之间。
  4. 垃圾很少甚至没有垃圾,仍会进行复制,很浪费。
  5. 没有新垃圾产生,会转换到另一种工作模式标记-清扫。
标记-清扫
  1. 遍历静态区与堆栈的引用,找出活的对象,然后给对象进行标记。
  2. 标记工作完成后,清理开始,释放没有被标记的对象。
  3. 剩下的堆空间是不连续的,然后整理剩下的对象。
分代回收
  1. 内存分配以较大的“块”为单位,如果块被引用,代数会增加,垃圾回收器会对上次回收动作之后新分配的块进行整理。
  2. 垃圾回收器会定期进行网站的清理动作—-大型对象不会被复制,但是代数增加,复制小型对象的块。
  3. 如果对象很稳定,垃圾回收效率低,就使用标记-清扫方式。
  4. 跟踪标记-清扫的效果,堆出现很多碎片,会切换回停止-复制。

附加技术

  1. 把程序或部翻译成本地机器码,提升运行技术。
  2. 当需要转载某个类时,编译器会找到其.class文件,然后类的字节码装入内存。
即时编译器编译所有代码
  1. 加载动作分布在整个程序生命周期内,累加其来花费更多时间
  2. 增加可执行代码长度,导致页面调度,降低运行速度。
惰性评估
  1. 只有在必要的时候才会编译代码,不会执行的代码根本不会编译。
  2. 代码每执行一次就会做一些优化执行次数越多,速度越快。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值