【JVM】【概念】【垃圾回收算法】

1、引用计数收集器
任何时刻计数器都为0的对象就是不可能再被使用的。但是Java语言中没有选用引用计数算法来管理内存,其中最主要的原因是它很难解决对象之间的相互循环引用的问题。
举个简单的例子,对象objA和objB都有字段instance,赋值令objA.instance = objB及objB.instance = objA,除此之外,这两个对象再无引用,实际上这两个对象已经不可能再被访问,理论上是应该被回收掉的,但是因为它们互相引用着对方,导致它们的引用计数都不为0,于是引用计数算法无法通知GC收集器回收它们。

2、跟踪收集算法

全局记录数据的引用状态,基于一定的条件触发(定时、内存不足的时候),执行时候从根集合来扫描对象的引用关系,这可能造成程序的暂停。

根集合的定义范围
当前运行线程的的栈上引用的对象;
常量及静态变量;
传递到本地方法中,但是还没有被本地方法释放的对象引用;
复制(copying)
概念:从根集合扫描出所有存活的对象,并把存活的对象复制到一块未使用的内存里面。
缺点:需要增加一块新的未使用内存进行对象复制
优点:不会有内存碎片,高效
使用场景:当存活对象比较少的时候比较适合,所以年轻代比较适合
标记–清除(Mark-sweep)
概念:从根结点进行扫描,对存活的对象进行标记,标记完后,在扫描未标记的对象,然后直接清除。
缺点:由于未存活的对象可能位于不同的位置,因此可以产生内存碎片,倒是创建大的对象的时候,无法分配内存
优点:不需要对象进行移动,也无需开辟新的空间,
使用场景:空间中存活对象较多的时候,比较合适
标记–压缩(Mark-compact)
概念:在基于标记-清除的算法之后,在对结果元素进行的移动的一步操作
缺点:由于和清楚算法相比又添加了一步移动的操作,因此成本较高
优点:解决了标记–清楚算法的缺点,由于把存活的对象移动了一次,因此避免产生了内存碎片
使用场景:年老代使用了这种算法

3、新生代的可用GC
为什么java堆内存分为新生代和老年代也就是为什么要进行分代式管理?

 因为他们通过对java程序的分析,认为程序中大部分的对象存活时间是比较短的,少部分对象是长期存在的,对于jvm来说能够合理的高效的回收对象是很重要的一个 工作,又因为jvm有三种内存回收算法(参考JVM内存回收算法文章),基于这样一种背景,他们讲JVM分成新生代和老年代。

为什么新生代内存又要分配出三块小内存呢?
我们还从内存回收效率来说。SUNJDK认为,新生代的对象通常存活的时间都比较短,因此可以基于复制的算法来实现GC.由于复制算法需要实现把存活的对象复制到一块未使用的空间,因此也就是出现了edenSpace,s0,s1三块内存空间。

3.1、串行GC
使用复制的GC算法对新生代的内存空间进行复制和扫描;使用标记-整理算法,对老年代进行对象回收
这个过程均采用单线程的方式来进行,因此叫做串行GC
比较适合单个CPU,新生代的空间较小及对暂停时间要求不是太高的引用。因为在GC的时候,应用程序会发生暂停。
eden,s0,s1的空间大小都按照配置的参数走,不存在动态的优化;
clinet级别和32windows上采用的默认GC方式
3.2、并行回收GC

也是采用的复制算法;
在扫描和复制的时候全部采用多线程的方式进行:
对新生代的GC回收做了很多优化,可以根据情况动态的调整的eden,s0,s1的内存空间
jvm的server级别,默认的采用这种回收算法;
由于采用多线程比较适合在多个CPU,且系统对暂停时间要求较短的引用服务上;
server级别虚拟机采用的默认方式
3.3、并行GC

4、旧生代和持久代可用的GC

4.1 串行GC
采用标记-压缩 和标记-清除相互结合的方式算法;
和新生代的串行方式相同也是单线程的
是client级别默认的GC方式
4.2 并行

采用标记-压缩的回收算法:
较于串行而言,采用的是多线程的方式进行GC操作,虽然旧生代的对象都比较大,在扫描和标示需要浪费一定时间,由于是采用多线程,因此也在一定程度降低了应用 程序在执行时候的暂停时间;
是server级别(非32位windows)采用的默认GC方式
4.3并发
采摘标记-清除的回收算法;

5、FULLGC触发的情况

除了直接调用System.gc之外,有以下几种情况:
旧生代的空间不足
当一些大对象经过MinorGC之后无法回收,然后进入旧生代之后,慢慢的旧生代的内存会不足,此时会触发FullGC。因此,尽量让许多对象在新生代阶段回收掉。
方法区的空间不足
方法区存放着一些class类的相关信息,在系统加载的类过多的时候,就会触发FULLGC操作。
当旧生代的剩余空间小于可能从新生代到Old区域的大小时候,就会触发fullGC,因此,新生代的内存也不能设置的过于大。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值