1.GC概念
GC 是指在程序运行过程中对一些没用了的对象,这些对象占据内存空间, 如果不及时回收会导致内存空间占用完,导致内存溢出, 相比c和c++ 是由代码主动控制回收,java 在后台有一个垃圾回收线程在不停扫描回收。java 中GC的对象是堆空间和永久区
2.GC算法
引用计数
:
只要这个对象用有一个引用 , 则在对象上标记+1 ,失去引用 -1 。当为引用为0 , 则释放空间 。
引用计数法的问题 :
a.引用和去引用伴随加法和减法,影响性能
b.很难处理循环引用(根本问题)
标记-清除
:
从根节点出发, 所有可达的对象标记为存活对象, 所有不可达的标记为垃圾对象, 然后清除阶段将标记为垃圾的对象清除完毕
标记-清除.png
标记-压缩
:
与标记清除不同的是, 将对象标记后, 将存活对象移动到一端 ,移动完成之后, 清除界限外的空间
标记压缩.png
复制算法
:将使用的内存分为两块, 每次只能使用其中1块 , 当进行垃圾回收时将存活对象复制到另一块去, 然后清除正在使用的内存块, 交换角色, 缺点空间浪费,不适用大对象空间回收。
复制算法.png
eden 采用标记清除算法,将还存活的对象放入幸存区, 当大对象塞不下时直接放入老年代,幸存区经过回收还存在的对象将进入老年代
图片.png
分代思想 : 依据对象的存活周期进行分类,短命对象归为新生代,长命对象归为老年代。根据不同代的特点,选取合适的收集算法
- 少量对象存活,适合复制算法
- 大量对象存活,适合标记清理或者标记压缩
可触及性 : 从根节点出发能触及到这个对象
可复活的 : 在finalize()方法中可能复活该对象。
不可触及的 : 不可触及对象不可能复活, 可以回收
可触及性.png
避免使用finalize() 方法,因为gc是不确定的,操作不慎可能导致错误。
Stop-The-World :是指java中一种全局暂停的现象 ,多半是由GC 引起 ,引起原因是发生GC时要求其他线程全部停止, 等GC完成后再重新工作。
网友评论