目前Java中可以作为GC ROOT的对象有:
1、虚拟机栈中引用的对象(本地变量表)
2、方法区中静态属性引用的对象
3、方法区中常亮引用的对象
4、本地方法栈中引用的对象(Native对象)
回收算法:
复制算法,标记清除算法(空间碎片问题),标记-整理算法;JVM为了优化内存的回收,使用了分代回收的方式,对于新生代内存的回收(Minor GC)主要采用复制算法。而对于老年代的回收(Major GC),大多采用标记-整理算法。
垃圾回收器简介:
- 新生代串行回收器 Serial(-XX:+UseSerialGC)
- 老年代串行回收器 SerialOld(-XX:+UseSerialGC)
- 新生代ParNew回收器 ParNew(-XX:+UseParNewGC)--老年代使用CMS。它只是简单地将串行回收器多线程化
- 新生代ParallelGC回收器 ParallelScavenge(-XX:+UseParallelGC) 非常关注系统的吞吐量。
- 老年代ParallelOldGC回收器 ParallelOld(-XX:+UseParallelOldGC) 它也是一种关注吞吐量的回收器
- 老年代CMS回收器 CMS (-XX:+UseConcMarkSweepGC):CMS垃圾回收器意在通过并发的方式适度减少吞吐量以达到减少用户线程停顿时间的目标。
第一步进行初始标记,这个过程只标记老年区中的根节点对象,这个过程会产生STW,但由于只标记根节点对象,所以时间特别短。第二步,并发标记,标记线程与用户线程并发运行,标记那些存活的对象;但是在这个过程中,用户线程由于进行并发执行,所以运行速度会变慢,此外在并发标记的过程中,用户线程还会产生一些垃圾、或是将一些垃圾重新用起来。第三步,重新标记,寻找安全点,用户线程会暂停执行(STW),对所有对象重新进行标记,将在并发标记过程中新产生的垃圾和垃圾重新用起来的问题解决掉。第四步,垃圾清理和正在运行的线程并发执行,垃圾清除算法采用Mark Sweep标记清除算法。因为垃圾清除线程和用户线程是并发执行,所以在这个过程中正在运行的线程还会产生垃圾,这些垃圾只能在下次垃圾回收时进行处理,这种垃圾叫做浮动垃圾。
- G1回收器