java垃圾回收机制

垃圾回收机制

java与从C++的区别之一就是C++需要手动管理内存,而java则不需要,java拥有一套比较完整的垃圾回收机制。

一、GC分代思想

java垃圾回收器(GC)能够自动回收垃圾、减轻了编程者的难度,不需要编程者自己去手动申请、释放内存。GC进行回收的主要区域是堆内存,因为堆内存是存放大量对象的内存区域。从GC的角度来看,堆内存可分为新生代和老年代,新生代占1/3的内存空间、老年代占用2/3的内存空间。
GC的分代思想:将堆内存划分为不同的区域,针对不同的区域及存放的对象特点采用不同的垃圾回收算法,避免内存的浪费。
在这里插入图片描述

新生代

新生代中区域可划分为Eden区、From区和To区,主要存放新创建的对象、对象在创建时,系统需要为对象分配其需要的内存空间,如果新生代中的Eden区是否有足够的内存空间,则会将该对象放入Eden中(如果占用内存较大,超过一定的阈值,会直接分配到老年代,阈值与具体JVM参数设置值有关)。From区域存放第一次存活的对象,To区域存放下一次存活的对象,这两个区域每一次minor GC会相互轮换,将From区域清空,变为To区域,,而To区域则成为From区域,且每一次存活对象的年龄就会加1,默认当对象的年龄达到15时便会移至老年代。

老年代

老年代主要存放存活次数多的对象以及占用内存空间比较大的对象。老年代一般不进行垃圾回收,在经过minor GC仍然没有足够内存分配给对象,则会进行major GC,对老年代进行回收。

二、GC回收算法

1、垃圾确定算法
确定垃圾主要有引用计数法和可达性分析两种。
(1)引用计数法
应用计数法是依据对象的引用的次数是否为零进行确定是否是要回收的垃圾,如果某对象的引用是0,则代表该对象没有被引用,就被标记为垃圾;对象每被引用一次计数会加1,失效则对应减1。
引用计数法产生的问题:循环引用。若A引用B,B引用A,则A,B其实是垃圾,但其A、B引用的计数都不为0,无法标记其为垃圾。
(2)可达性分析
将某些对象作为GC root,从一系列GC root开始进行搜索,如果GC root到该对象没有一条可达路径,则该对象是不可达的。不可达对象经过至少两次标记将会成为可回收对象。
可作为GC root的对象一般有:

  • 虚拟机栈中引用的对象。如各个线程被调用的方法中使用的参数、局部变量等。

  • 方法区中类静态属性引用的对象。

  • 方法区中常量引用的对象。

  • 所有被同步锁synchronized持有的对象。

  • java虚拟机内部的引用。如基本数据类型对应的class对象,一些常驻的异常对象等。

  • 本地方法栈内本地方法引用的对象。
    2、垃圾回收算法
    依据分代的思想、根据新生代和老年代的特点,有不同的垃圾回收算法。新生代主要采用复制算法,因为新生代中在垃圾回收时存活的对象很少。老年代由于可回收的对象很少,因此主要采用标记-整理算法。
    (1)标记-清除算法
    标记-清除算法顾名思义,该算法分为两个步骤,第一个步骤是对可回收的对象进行标记,第二阶段是对可回收对象进行清除。该算法会导致内存碎片等问题。
    (2)复制算法
    复制算法按内存容量将内存划分为等大小的两块。每次只使用其中一块,当这一块内存满后将尚存活的对象复制到另一块上去,把已使用的内存清掉。

    (3)标记-整理算法
    标记-整理算法也是分为两个步骤,先是标记可回收的对象,在将可回收对象回收完成之后将已占用的内存空间移至一边,而未被占用和回收的内存区域移至一边,并不会导致内存碎片化的问题。

三、常用垃圾回收器

依据新生代与老年代特点,有与之相对应的垃圾回收器,此外,为提高回收效率,减少线程停顿时间,也有单线程与多线程的垃圾回收器。总之,不同的垃圾回收器具有不同的适用场景。JDK1.6 中 Sun HotSpot 虚拟机的垃圾回收器如图。
在这里插入图片描述

一般垃圾回收器在进行垃圾收集时,都会有“stop all world”的步骤,即在进行垃圾回收时,将会停止其他线程的工作。
1、serial
seral垃圾回收器是新生代的回收器,使用复制算法,单线程工作,没有线程间的交互,垃圾收集时会暂停所有的工作线程,对于单个CPU的系统来说,简单高效,是java虚拟机运行在客户端模式下的默认新生代垃圾回收器。
2、serial old
是serial的老年代版本,使用的是标记-整理算法,其他原理与serial基本一致,是java虚拟机运行在客户端模式下的默认老年代垃圾回收器。
3、parNew
对于多CPU环境来说,使用serial则会浪费多CPU的资源,parNew是serial的多线程版本,使用的也是复制算法,垃圾收集时需要暂停其他工作线程,是java虚拟机运行在服务端模式下的默认垃圾回收器。
4、parallel scavenge
新生代垃圾回收器,使用的复制算法,只不过该垃圾回收器关注点并不在“stop the world”的时间上,而在于吞吐量,使程序达到一个可控制的吞吐量,吞吐量的定义为CPU运行代码时间/(CPU运行代码时间+垃圾收集时间)。
5、parallel old
是parallel scavenge的老年代版本,使用多线程的标记-整理算法,是吞吐量优先的垃圾回收器。
6、CMS
CMS是一种过度的垃圾回收器,由于在垃圾收集时会暂停其他工作线程,这个停顿时间对于用户有时候是难以忍受的,而CMS垃圾回收器就是一种为减少甚至消除停顿时间的垃圾回收器。
CMS垃圾回收器的回收过程主要分为四个阶段:初始标记、并发标记、重新标记和并发清除。其中初始标记和重新标记的过程需要暂停其他线程的工作,但是这两个阶段所占用的时间比较短,因此造成的停顿时间是比较短的。
在这里插入图片描述
7、G1
G1垃圾回收器也是一种减少停顿时间的垃圾回收器。G1的特点主要有:

  • 基于标记-整理算法,不产生内存碎片。
  • 可以非常精确控制停顿时间,在不牺牲吞吐量前提下,实现低停顿垃圾回收。
    G1是基于分区的思想,避免全区域垃圾收集,它把堆内存划分为大小固定的几个独立区域,并且跟踪这些区域的垃圾收集进度,同时在后台维护一个优先级列表,每次根据所允许的收集时间,优先回收垃圾
    最多的区域。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值