Java GC垃圾收集器-2019-09-09

                                                                垃圾收集器

目前有三大Java虚拟机:HotSpot,oracle JRockit,IBM J9。

1、Java堆内存划分?

     新生代和老年代;将新生代划分为:Eden\from\to (比例:8:1:1)

    方法区与永久代关系: 其实是一个东西,方法区是JVM规范概念,而永久代则是Hotspot虚拟机特有的概念(就像接口与实现类的区别)。

    方法区是堆的一部分,但虚拟机为了区分,也叫非堆。它也需要GC的(废弃常量和无用的类)。JDK1.8后,永久代已经没有了,取而代之的是Metaspace(元空间),元空间并不在虚拟机中,而是使用了本地内存,元空间大小受本地内存限制。通过-XX:MetaspaceSize设置初始大小,达到该值就会触发垃圾收集进行类型卸载。

2、如何判断对象是否存活?

  •  引用计数算法(给对象添加一个引用计数器,每当有地方引用+1,否则减1) 。劣势:很难解决对象之间循环引用问题。
  •  可达性分析算法; 通过一系列的称为"GC Root” 的对象作为起始点,从这些节点开始向下搜索,搜索走路的路径称为引用链,当一个对象到GC Root没有任何引用链相连,说明该对象不可达、不可用的。                                                                                               GC Root对象(JVM认为root是不可回收的,并且root对象引用的对象也是不可回收的) 如:虚拟机栈(栈帧中本地变量表)中引用的对象、静态变量对象、常量对象 、本地方法中栈中Native方法引用的对象。

3、什么时候回收? 

       判定对象是否可回收,需要经历两个阶段;

      1)、第一阶段是可达性分析,分析该对象是否可达;

      2)、第二阶段是当对象没有重写finalize()方法或已经被调用过,JVM认为该对象不可救活,因此回收该对象。(finalize方法在垃圾回收中的作用是,给对象一次救活的机会或在释放对象前必须执行的操作)

4、虚拟机频繁full gc应该如何处理? 

    full GC 是指清理整个堆空间,包括年轻代和永久代; 

    1) 首先用命令查看触发GC的原因是什么 jstat –gccause 进程id
    2) 如果是System.gc(),则看下代码哪里调用了这个方法
    3) 如果是heap inspection(内存检查),可能是哪里执行jmap –histo[:live]命令
    4) 如果是GC locker,可能是程序依赖的JNI库的原因

5、对象类型

     四种类型:强引用、软引用(SoftReference)、弱引用(WeakReference)、虛引用(PhantomReference);

     强引用:某个对象有强引用与之关联,JVM必定不回收这个对象。

     软引用:用来描述一些有用但并不是必需的对象,只有在内存不足的时候JVM才会回收该对象。很适合用来实现缓存。

     弱引用:非必要对象,无论内存是否充足,都会被回收。

6、垃圾收集器算法

  • 标识-清除 (标记出所有要回收的对象,标识完成后统一回收被标记的对象) 不足:1)效率问题 2)空间问题(产生不连续的内存碎片);
  • 复制(将内存分成两块相等的大小,每次只使用一块,将存活的对象复制到另外一块上,然后清除已使用过空间);简单、运行高效,但内存缩小了一增;
  • 标识-整理(先标记出所有存活对象,并将存活对象向一端移动);
  • 分代收集(将堆分成新生代和年老代,并选择适用的算法);

7、垃圾收集器

  • Serial收集器 单线程(只使用一个CPU或一个收集线程完成收集工作) 它进行收集时,必须暂停其他所有工作线程,直到它收集结束。简单高效但会停顿给用户体验不好。JDK1.3之前作为新生代收集器,使用复制算法;
  • ParNew收集器 是Serial收集器的多线程。多个垃圾收集线程并行工作,但此时用户线程仍然处于等待状态,使用复制算法;
  • Parallel Scavenge收集器(吞吐量优先) 新生代收集器、并行多线程、复制算法。与ParNew不同的是:高效地利用CPU时间,尽快完成程序运算任务,达到一个可控制的吞吐量,适合在后台运算而不需要太多交互的任务,而其它的收集器的目标是尽可能地缩短垃圾收集时用户线程的停顿时间,适合与用户交互的程序。
  • CMS收集器(并发收集,低停顿) 一种以获取最短回收停顿时间为目标的收集器。标记-清除算法
  • G1收集器(并行并发、整体基于标记-整理算法)
  • 并行与并发区别;并行:多条垃圾收集器线程并行工作,但此时用户线程仍然处于等待状态;并发:指用户线程与垃圾收集器同时执行(但不一定是并行,可能是交替执行);

8、查看JVM垃圾收集器命令 

      java -XX:+PrintCommandLineFlags -XX:+PrintGCDetails -version

      jdk1.8 默认垃圾收集器Parallel Scavenge(新生代)+Parallel Old(老年代)

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值