Garbage Collect 垃圾回收
如何确定一个对象是垃圾
- 引用计数法
- 对于一个对象而言,如果应用程序持有该对象的引用,就说明该对象不是垃圾,如果一个对象没有任何指针对其引用,那么这个对象就是垃圾。
- 缺点:如果两个对象互相持有彼此的引用,那么这个对象永远不会被回收。
- 可达性分析法
- 定义:通过GC Root的对象,开始向下寻找,看某个对象是否可达。
- 能作为GC Root的:类加载器、Thread、虚拟机栈中的本地变量表、static成员、常量引用、本地方法栈的变量等。
垃圾收集算法
- 标记-清除
- 定义:扫描堆中的所有对象,找出需要回收的垃圾,并标记出来;扫描完成后,对标记的对象进行清除,释放内存空间。
- 缺点: 标记和清除两个过程都是需要扫描堆中的所有对象,比较耗时,效率不高。 会产生大量不连续的内存碎片,空间碎片过多可能会造成后续对象找不到一个连续的内存空间而不得不触发一次GC操作。
- 复制
- 定义:将内存空间分割成两个相等的区域,每次只使用一块。(堆区中的Young区的Survivor区)
- 缺点:空间利用率低。
- 标记-整理
- 扫描堆中所有的对象,找出需要被回收的垃圾,并标记出来;标记完成后,所有存活的对象往一边移动,清除掉边界以外的对象。
垃圾收集器
- Serial收集器
单线程收集器,在进行GC的时候需要暂停其他线程。(复制算法,适用于新生代–Young区)。
- ParNew收集器
多线程收集器,在GC时需要暂停其他线程。(多核CPU情况下,效率比Serial收集器高,复制算法,适用于新生代—Young区)。
- Parallel Scavenge收集器
多线程,采用复制算法的新生代收集器,关注系统的吞吐量。
吞吐量 = 运行用户代码的时间/(运行用户代码的时间+垃圾收集时间)。
吞吐量越大,垃圾收集时间越短,程序运行效率越高。-XX:GCTimeRatio 直接设置吞吐量大小
- Serial Old收集器
单线程收集器,进行GC时需要暂停其他线程。(标记-整理算法,对老年代进行收集)
- Parallel Old收集器
多线程收集器,采用标记-整理算法对老年代进行GC。
- CMS收集器
一种以获取最短停顿时间为目标的收集器。
- G1收集器:
特点 :并行与并发、 分代收集、 空间整合(属于标记-整理算法)、可预测的停顿。
垃圾收集器分类
- 串行收集器:Serial和Serial Old,只能有一个垃圾回收线程执行,其他线程暂停。
- 并行收集器:Parallel Scanvenge 和Parallel Old,多条垃圾线程并行工作,但此时用户线程暂停。
- 并发收集器:CMS和G1,垃圾回收线程和用户线程并行执行(可能是交互执行),垃圾回收线程在执行期间不会停顿用户线程的执行。
如何选择垃圾收集器
优先调整堆的大小让服务器自己来选择。
如果内存小于100M,使用串行收集器。
如果是单核,并且没有停顿时间要求,使用串行或者JVM自己选。
如果允许停顿时间超过1秒,选择并行或者JVM自己选。
如果响应时间最重要,并且不能超过1秒,选择并发收集器。
16万+

被折叠的 条评论
为什么被折叠?



