我所认识的垃圾回收
2016-03-17 10:51
246 查看
finalize方法认识
当GC扫描到有对象没有任何引用指向它时 就会调用该对象的finalize方法,等到下次再次扫描到的时候就会真正回收对象,释放所占内存,所以如果需要在垃圾回收时做一些清理保存工作,可以在对象的finalize方法中处理。
并且之所以要有finalize方法,是由于在分配内存是采用了类似C语言的做法,而非java中的通常做法。这种情况多发生在使用“本地方法”的情况下,本地方法是一种java调用非java代码的方式,本地方法只支持c和c++。在费java代码中,也许会调用c的malloc()函数来分配存储空间,而且除非使用了free()函数,否则存储空间将得不到释放,从而造成内存泄漏。当然,free()是c和c++的函数,所以需要在finalize()中用本地方法调用它。
垃圾回收发生的原因是为了回收程序不再使用的内存
GC回收有多重回收策略,(停止-复制 标记-清扫)使用哪一种策略取决于java虚拟机 如果所有对象都很稳定,垃圾回收器的效率降低的话,就切换到“标记-清扫”方式,同样,java虚拟机会跟踪“标记-清扫”效果,如果发现堆内存中出现很多零碎空间,则切换到“停止-复制”方式。这就叫“自适应”技术,所以
GC回收可以理解为“自适应的,分代的,停止-复制的,标记-清扫”式GC。
停止-复制
是另外复制一块相同的堆内存,将有用的对象移到新的堆空间中,将剩下的无用的内存回收,适用于回收很多零碎内存,并且新堆空间的内存是连续的,这种方式缺点是得维护两块内存,效率降低,常发生在这些大内存空间中。
标记-清扫
是堆指针遍历所有堆内存对象,每当找到一个存活的对象,就给对象设计一个标记,当全部标记工作完成的时候,清理工作才会开始,没有标记的对象将被释放,所以剩下的堆内存是不连续的,如需连续,还需整理。
当GC扫描到有对象没有任何引用指向它时 就会调用该对象的finalize方法,等到下次再次扫描到的时候就会真正回收对象,释放所占内存,所以如果需要在垃圾回收时做一些清理保存工作,可以在对象的finalize方法中处理。
并且之所以要有finalize方法,是由于在分配内存是采用了类似C语言的做法,而非java中的通常做法。这种情况多发生在使用“本地方法”的情况下,本地方法是一种java调用非java代码的方式,本地方法只支持c和c++。在费java代码中,也许会调用c的malloc()函数来分配存储空间,而且除非使用了free()函数,否则存储空间将得不到释放,从而造成内存泄漏。当然,free()是c和c++的函数,所以需要在finalize()中用本地方法调用它。
垃圾回收发生的原因是为了回收程序不再使用的内存
GC回收有多重回收策略,(停止-复制 标记-清扫)使用哪一种策略取决于java虚拟机 如果所有对象都很稳定,垃圾回收器的效率降低的话,就切换到“标记-清扫”方式,同样,java虚拟机会跟踪“标记-清扫”效果,如果发现堆内存中出现很多零碎空间,则切换到“停止-复制”方式。这就叫“自适应”技术,所以
GC回收可以理解为“自适应的,分代的,停止-复制的,标记-清扫”式GC。
停止-复制
是另外复制一块相同的堆内存,将有用的对象移到新的堆空间中,将剩下的无用的内存回收,适用于回收很多零碎内存,并且新堆空间的内存是连续的,这种方式缺点是得维护两块内存,效率降低,常发生在这些大内存空间中。
标记-清扫
是堆指针遍历所有堆内存对象,每当找到一个存活的对象,就给对象设计一个标记,当全部标记工作完成的时候,清理工作才会开始,没有标记的对象将被释放,所以剩下的堆内存是不连续的,如需连续,还需整理。
相关文章推荐
- object-c 的runtime.h
- 海康大华RTSP格式
- 关于pytesser的一些问题
- JDBC借助Spring进行增删改查的操作--大大简化了程序
- ELK服务端安装部署
- BugHD for JavaScript上线,轻松收集前端 Error
- TableView的封装
- Java Script常用小脚本
- CentOS 7 安装 JDK8 详细步骤
- 堆排序
- MyCommTool串口工具使用方法
- Android内存泄漏分析及实践(一)
- fragment与activity之间通信整理
- docker迁移容器
- 转个堆与栈的区别
- 浅谈 RxAndroid + Retrofit + Databinding
- Forms authenctication cookie issue
- python网络学习(02)
- Linux基础回顾之基础命令五(用户及组)
- 静态路由命令配置