finalize()方法
工作原理
一旦垃圾回收器准备好释放对象占用的存储空间,首先调用finalize()方法,并且在下一次垃圾回收动作发生时,才会真正回收对象的内存。
要点
- 对象可能不被垃圾回收。
- 垃圾回收不等于析构。(C++中销毁对象必须使用析构函数,且对象一定会被销毁。)
- 垃圾回收只与内存有关。
垃圾回收器
存储空间的释放会影响存储空间的分配—-某些Java虚拟机的工作方式。
引用计数器
- 每个对象都有一个引用计数器。
- 引用接至对象,计数+1
- 引用离开作用域或被置为null,计数-1
- 垃圾回收期会在含有全部对象的列表上遍历,当某个计数为0.释放器占用空间。
- 如果对象之间存在循环引用,会出现“对象应该被回收,但引用计数却不为0”.
- 这是说明垃圾手机的工作方式,但是未被应用任何一种Java虚拟机中。
“活”的对象
对于任何活的对象,一定能追溯其存货在堆栈或静态存储区之中的引用。遍历所有引用,找到所有活的对象。
解决“交互自引用的对象组”的问题,这种现像根本不会被发现,因此被自动回收。
自适应垃圾回收技术
停止-复制
- 暂停程序的运行,然后将所有存活的对象从当前堆复制到行对保持紧凑排列,然后进行重新分配新空间。
- 所有的引用都被修正,位于堆或静态区的直接被修正,其他引用,遍历过程中才能被找到(旧地址映射到新地址)
- 维护比实际需要多一倍的空间,适用于大块内存之间。
- 垃圾很少甚至没有垃圾,仍会进行复制,很浪费。
- 没有新垃圾产生,会转换到另一种工作模式标记-清扫。
标记-清扫
- 遍历静态区与堆栈的引用,找出活的对象,然后给对象进行标记。
- 标记工作完成后,清理开始,释放没有被标记的对象。
- 剩下的堆空间是不连续的,然后整理剩下的对象。
分代回收
- 内存分配以较大的“块”为单位,如果块被引用,代数会增加,垃圾回收器会对上次回收动作之后新分配的块进行整理。
- 垃圾回收器会定期进行网站的清理动作—-大型对象不会被复制,但是代数增加,复制小型对象的块。
- 如果对象很稳定,垃圾回收效率低,就使用标记-清扫方式。
- 跟踪标记-清扫的效果,堆出现很多碎片,会切换回停止-复制。
附加技术
- 把程序或部翻译成本地机器码,提升运行技术。
- 当需要转载某个类时,编译器会找到其.class文件,然后类的字节码装入内存。
即时编译器编译所有代码
- 加载动作分布在整个程序生命周期内,累加其来花费更多时间
- 增加可执行代码长度,导致页面调度,降低运行速度。
惰性评估
- 只有在必要的时候才会编译代码,不会执行的代码根本不会编译。
- 代码每执行一次就会做一些优化执行次数越多,速度越快。