Java垃圾收集器算法

	**引用计数算法**:在对象中添加一个引用计数器,每当有一个地方引用他时,计数器值就加一,当引用失效是=时,计数器值就减一,为零时的对象就是不可能再被使用。优点:虽然占用了一些额外的内存空间用来计数,但是原理简单,判定效率也很高。缺点:有很多例外情况要考虑,必须配合大量额外处理才能保证正确地工作。碧如单纯的引用计数就很难解决对象之间相互循环使用的问题。
	**可达性分析算法**:通过一系列称为“GC Roots” 的根对象作为起始节点集,从这些节点根据引用关系向下搜索,搜索过程所走过的路径称为“引用链”。如果某对象到GC Roots间没有任何引用链相连,就是从GC Roots 到这个对象不可达,则证明这个对象是不可能再被使用,判定为可回收对象。
	GC Roots 对象包括以下几种:
		1.在虚拟机栈中引用的对象,譬如各个线程被调用的方法堆栈中使用到的参数、局部变量、临时变量等。
		2.在方法区中类静态属性引用的对象,譬如Java类的引用类型静态变量。
		3.在方法区中常量引用的对象,譬如字符串常量池里的引用
		4.在本地方法栈中JNI即Native方法引用的对象
		5.Java虚拟机内部的引用,如基本数据类型对应的Class对象,一些常驻的异常对象还有系统类加载器。
		6.所有同步锁持有的对象。
		7.反映Java虚拟机内部情况的JNXBean、JVMTI中注册的回调、本地代码缓存等
	**引用**分为强引用,软引用,弱引用,虚引用,强度依次减弱
		强引用是指程序代码中普遍存在的引用赋值,无论任何情况下只要强引用存在,被引用的对象就不可能被垃圾处理器回收
		软引用是用来描述一些还有用但是非必须的对象。只被软引用关联着的对象,在系统将要发生内存溢出前,会把这些对象列进回收范围进行二次回收,如果这次回收还没有足够内存才抛出内存溢出异常
		弱引用也是用来描述那些非必须的对象,被关联的对象只能生存到下一次垃圾收集发生为止,无论内存是否足够
		虚引用也被称为幽灵引用或者幻影引用,一个对象是否有虚引用的存在完全不对其生存时间构成影响,为一个对象设置虚引用关联的唯一目的只是为了能在这个对象呗回收时收到一个系统通知。
		**分代收集理论**:1.弱分代假说:绝大多数对象都是朝生夕灭的;2,强分代假说: 熬过越多次垃圾收集过程的对象越难以消亡。这两个分代假说共同奠定了多款常用的垃圾收集器的一致的设计原则:收集器应该将Java堆划分为不同的区域,然后将回收对象依据其年龄分配到不同的区域之中存储。3.跨代引用假说:跨代引用相对于同代引用来说只占极少数。
		**安全点**:安全点是在程序执行期间的所有GC Root已知并且所有堆对象的内容一致的点。

从全局的角度来看,所有线程必须在GC运行之前在安全点阻塞。 (作为一种特殊情况,运行JNI代码的线程可以继续运行,因为它们只使用句柄。但在安全点期间,它们必须阻塞而不是加载句柄的内容。)
从本地的角度来看,安全点是一个显着的点,它位于执行线程可能阻止GC的代码块中。 大多数调用点都能当做安全点。
在每个安全点都存在强大的不变量永远保持true不变,而在非安全点可能会被忽视。 编译的Java代码和C / C ++代码都在安全点之间进行了优化,但跨安全点时却不那么优化。 JIT编译器在每个安全点发出GC映射。 VM中的C / C ++代码使用程式化的基于宏的约定(例如,TRAPS)来标记潜在的安全点

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章