GC:对象进内存,对象出内存。 当在堆里面的对象没有栈里面的指针指向其时,可以杀死这个对象,释放内存。解决内存泄漏的问题。
根搜索算法:GC Roots的对象作为起点,从这些起点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连时,则证明此对象不再被使用。
标记清除算法:标记-清除算法是现代垃圾回收算法的思想基础。标记-清除算法将垃圾回收分为两个阶段:标记阶段和清除阶段。一种可行的实现是,在标记阶段,首先通过根节点,标记所有从根节点开始的可达对象。因此,未被标记的对象就是未被引用的垃圾对象。然后,在清除阶段,清除所有未被标记的对象。
缺点:一是效率问题,标记和清除两个过程效率都不高;二是空间问题,标记清除之后会产生大量不连续的内存碎片。
说到GC roots(GC根),在JAVA语言中,可以当做GC roots的对象有以下几种:
1、栈(栈帧中的本地变量表)中引用的对象。
2、方法区中的静态成员。
3、方法区中的常量引用的对象(全局变量)
4、本地方法栈中JNI(一般说的Native方法)引用的对象。
JVM运行吞吐量:运行时间 / 运行时间+GC时间
新生代:复制算法
老年代:标记压缩
复制算法: 将原有的内存空间分为两块,每次只使用其中一块,在垃圾回收时,将正在使用的内存中的存活对象复制到未使用的内存块中,之后,清除正在使用的内存块中的所有对象,交换两个内存的角色,完成垃圾回收。
Eden区
Survivor区:FROM区
TO区
缺点:以空间换时间
标记-压缩算法:也称为标记整理算法,标记-压缩算法适合用于存活对象较多的场合,如老年代。它在标记-清除算法的基础上做了一些优化。和标记-清除算法一样,标记-压缩算法也首先需要从根节点开始,对所有可达对象做一次标记;但之后,它并不简单的清理未标记的对象,而是将所有的存活对象压缩到内存的一端;**之后,清理边界外所有的空间。
Stop-The-World:简称STW。它是Java中一种全局暂停的现象。全局停顿,所有Java代码停止,native代码可以执行,但不能和JVM交互。这种现象多半由于GC引起的,此外Dump线程、死锁检查、堆Dump都有可能引起STW,但这几种情况一般都是人为触发。
GC的工作必须在一个能确保一致性的快照中进行。
这里的一致性的意思是:在整个分析期间整个执行系统看起来就像被冻结在某个时间点上,不可以出现分析过程中对象引用关系还在不断变化的情况,该点不满足的话分析结果的准确性无法得到保证。
这点是导致GC进行时必须停顿所有Java执行线程的其中一个重要原因。