1.引用计数法
不能解决对象循环依赖的问题。因此一般不用这种。
2.可达性分析算法。
GCRoots 不可达时 对象死,采用这个。
1.标记清除算法
1.标记、清除阶段效率不高。
2.标记清除之后会产生大量不连续的碎片,导致分配较大的对象时候,无法找到足够的连续内存。
2.复制算法
1.两块相同的内存空间,一块使用,一块空闲,导致空间浪费。不存在碎片问题。
3.记整理算法
1.标记过程与"标记清除算法"一样,整理过程是让所有存活对象都往一端移动,然后直接清理掉边界以外的内存。
4.分代收集算法。
把对象进行分代,新生代和来年代。
总结
新生代一般用复制算法,老年代一般用标记整理或者标记清除算法。
CMS在老年代的整个过程分为4个步骤:
1.初始标记stop the word 仅仅标记GC Roots能直接关联到的对象,速度很快
2.并发标记进行GCRoots Tracing的过程(判断对象是否仍在使用中)和用户线程一起工作。3 .重新标记stop the word 修正并发标记阶段因用户程序继续运行而导致标记发生变动的那一部分标记记录。此阶段比初始标记阶段稍长,但远比并发标记阶段的时间短。
4.并发清除 和用户线程一起工作。
内存组成:Eden、 Survivor、 Old、 Humongous
内存变化:字符串内部池,已经在JDK7中从永久代中移除,JDK1.7中,存储在永久代的部分数据就已经转移到了JavaHeap或者是NativeHeap。但永久代仍存在于JDK1.7中,并没完全移除,譬如符号引用(Symbols)转移到了native heap;字面量(internedstrings)转移到了javaheap;类的静态变量(classstatics)转移到了java heap持久代也移动到了普通的堆内存空间中,改为元空间 。
大对象的分配
1 TLAB(Thread Local Allocation Buffer)线程本地分配缓冲区
2 Eden区中分配
3 Humongous区分配
GC模式
G1提供了两种Young GC和Mixed GC,两种都是Stop The World(STW)
原文:https://blog.51cto.com/14987832/2558098