我所认识的垃圾回收

来源:互联网 发布:显示器亮点测试软件 编辑:程序博客网 时间:2024/05/14 07:12

finalize方法认识

当GC扫描到有对象没有任何引用指向它时 就会调用该对象的finalize方法,等到下次再次扫描到的时候就会真正回收对象,释放所占内存,所以如果需要在垃圾回收时做一些清理保存工作,可以在对象的finalize方法中处理。

并且之所以要有finalize方法,是由于在分配内存是采用了类似C语言的做法,而非java中的通常做法。这种情况多发生在使用“本地方法”的情况下,本地方法是一种java调用非java代码的方式,本地方法只支持c和c++。在费java代码中,也许会调用c的malloc()函数来分配存储空间,而且除非使用了free()函数,否则存储空间将得不到释放,从而造成内存泄漏。当然,free()是c和c++的函数,所以需要在finalize()中用本地方法调用它。

垃圾回收发生的原因是为了回收程序不再使用的内存

GC回收有多重回收策略,(停止-复制   标记-清扫)使用哪一种策略取决于java虚拟机  如果所有对象都很稳定,垃圾回收器的效率降低的话,就切换到“标记-清扫”方式,同样,java虚拟机会跟踪“标记-清扫”效果,如果发现堆内存中出现很多零碎空间,则切换到“停止-复制”方式。这就叫“自适应”技术,所以GC回收可以理解为“自适应的,分代的,停止-复制的,标记-清扫”式GC。

停止-复制是另外复制一块相同的堆内存,将有用的对象移到新的堆空间中,将剩下的无用的内存回收,适用于回收很多零碎内存,并且新堆空间的内存是连续的,这种方式缺点是得维护两块内存,效率降低,常发生在这些大内存空间中。

标记-清扫 是堆指针遍历所有堆内存对象,每当找到一个存活的对象,就给对象设计一个标记,当全部标记工作完成的时候,清理工作才会开始,没有标记的对象将被释放,所以剩下的堆内存是不连续的,如需连续,还需整理。

0 0
原创粉丝点击