JVM垃圾回收

2019-09-26  本文已影响0人  hcq0514

什么是垃圾

简单来说已经不再被使用的资源就是垃圾

怎么判断一个资源是垃圾

  1. 引用计数法(一般不用)
  1. 可达性分析

java采用GC Roots可达性分析来判定是否可回收

  1. 跟踪收集器采用的为集中式的管理方式,全局记录对象之间的引用状态,执行时从一些列GC Roots的对象做为起点,从这些节点向下开始进行搜索所有的引用链,当一个对象到GC Roots 没有任何引用链时,则证明此对象是不可用的。
  2. 哪些对象可以作为 GC Roots 的对象:

3.GC Roots可达性图示



Object7,8虽然有被引用,但是没有GC Roots可以引用到,所以会被回收

java里四种引用状态(强软弱虚)对应着不同的垃圾回收机制

四种基本GC 垃圾回收算法

注:没有最合适的算法,都是各有利弊,现在一般是用的"分代收集算法",它其实不是一种算法,是一种算法思想,简单来说就是不同的生命周期用不同的收集算法,比如新生区用Copying,老生区用Mark-Sweep。
GC 算法是内存回收的方法论,垃圾收集器就是算法的落实的实现。

四种垃圾收集器

  1. 串行垃圾回收器(Serial)
    它为单线程环境设计且只使用一个线程进行垃圾回收,会暂停所有的用户线程,所以不适合服务环境。


    image.png
  1. 并行垃圾回收器(Parallel)
    多个垃圾收集线程并行工作,此时用户线程是暂停的,用于科学计算、大数据处理等弱交互场景。


    image.png
  2. 并发垃圾回收器(CMS)
    用户线程和垃圾收集线程同时执行(不一定是并行,可能是交替执行),不需要停顿用户线程,互联网公司多用它,适用对相应时间有要求的场景。


    image.png
  3. G1 垃圾回收器
    G1 垃圾回收器将堆内存分割成不同的区域然后并发的对其进行垃圾回收。

Java垃圾回收器详解及配置说明

  1. Java 的 GC 回收的类型主要有:
    UseSerialGC,UseParallelGC,UseConcMarkSweepGC,UseParNewGC,UseParallelOldGC,UseG1GC
    Java 8 以后基本不使用 Serial Old
    参数说明
    DefNew : Default New Generation
    Tenured : Old
    ParNew : Parallel New Generation
    PSYoungGen : Parallel Scavenge
    ParOldGen : Parallel Old Generation
  2. 查看当前配置的垃圾回收器
Java -XX:+PrintCommandLineFlags
  1. 垃圾收集器使用区域


  1. 配置参数所对应的垃圾收集器
参数 新生代垃圾收集器 新生代算法 老年代垃圾收集器 老年代算法
XX +Use SerialGc SeriaIGC 复制算法 SerialOldGC 标整
XX +Use ParNewGC ParNew 复制算法 SerialOldGC 标整
XX +Use ParalleIGC /-XX +Use ParallelOldGC Parallel【Scavenge】 复制算法 Parallel Old 标整
XX:+Use ConcMark SweepGC ParNew 复制算法 CMS+ Serial Old的收集器组合(Serial Old作为CMS出错的后备收集器) 标清

G1里没有明确地区分新生代老生代,G1整体上采用标记整理算法,局部是通过复制算法,不会产生内存碎片:

  1. G1垃圾收集器
    在G1里面,其实没有严格地把哪些区域划分为新生代或者老生代,所以他比较特殊,特地拿出来。
    从JDK1.9开始,已经是默认使用G1来做垃圾收集器了。
上一篇 下一篇

猜你喜欢

热点阅读