JVM虚拟机回收机制

 JVM虚拟机分代

JVM内存分代策略:

Java虚拟机根据对象存活的周期不同,把堆内存划分为几块,一般为新生代、老年代和永久代(即持久代)。

注:此处是对HotSpot虚拟机而言。

为什么要分代:

堆内存是虚拟机管理的内存中最大的一块,也是垃圾回收最频繁的一块区域,我们程序所有的对象实例都存放在堆内存中。给堆内存分代是为了提高对象内存分配和垃圾回收的效率。试想一下,如果堆内存没有区域划分,所有的新创建的对象和生命周期很长的对象放在一起,随着程序的执行,堆内存需要频繁进行垃圾收集,而每次回收都要遍历所有的对象,遍历这些对象所花费的时间代价是巨大的,会严重影响我们的GC效率。

有了内存分代,情况就不同了,新创建的对象会在新生代中分配内存,经过多次回收仍存活下来的对象存放在老年代中,静态属性、类信息等存放在永久代中,新生代中的对象存活时间短,只需要在新生代区域中频繁进行GC,老年代中对象生命周期长,内存回收的频率相对较低,不需要频繁进行回收,永久代中回收效果太差,一般不进行垃圾回收,还可以根据不同年代的特点采用合适的垃圾收集算法。分代收集大大提升了收集效率,这些都是内存分代带来的好处。

JVM底层堆内存分为三大区:

新生代区、老年区、持久区。

其中新生代与老年代是垃圾回收的主要区域。

而新生代区又被分成了:Eden、From Survivor、To Survivor三块

当有新的对象被定义到堆内存之后,首先对象会进入堆内存,之后在经过一轮GC垃圾回收之后,如果Eden区中依然存在未被回收的对象则会将这些对象复制到To Survivor区中并按内存顺序排列防止产生碎片,在这一轮GC结束之后讲这些对象转移到From Survivor区等待下一轮GC,下一轮GC如果在Eden区与From Survivor区中存在未被回收的对象则会将这些对象转移到To Survivor区,之后等待这一轮GC结束在此将这些对象复制到From Survivor区。也就是说To Survivor区是新生代区中未被回收的对象的中转站,在每一轮GC开始之前他里面的对象都会被复制到From Survivor区。而对象在From Survivor区中每经过一轮GC之后对象的年龄就会加一(年龄被存储在header中)当年龄到达15之后,就不在转移到新生代的To Survivor区中,而是转移到老年代区中。

在新生代中经历了多次(具体看虚拟机配置的阈值)GC后仍然存活下来的对象会进入老年代中。老年代中的对象生命周期较长,存活率较高,在老年代中进行GC的频率相对而言较低,而且回收的速度也比较慢。

永久代存储类信息、常量、静态变量、即时编译器编译后的代码等数据,对这一区域而言,Java虚拟机规范指出可以不进行垃圾收集,一般而言不会进行垃圾回收。

垃圾回收常见算法

1.引用计数

比较古老的回收算法,原理是此对象有一个引用,即增加一个计数,删除一个引用则减少一个计数。垃圾回收时,只用收集计数为0的对象。此算法最致命的是无法处理循环引用的问题。

2.复制

此算法把内存空间划分为两个相等的区域,每次只使用其中的一个区域。垃圾回收时,遍历当前使用区域,把正在使用中的对象复制到另外一个区域中。此算法每次只处理正在使用中的对象,因此复制成本比较小,同时复制过去以后还能进行相应的内存整理,不会出现“碎片”问题。当然,此算法的缺点也是很明显的,就是需要两倍内存空间。

3.标记-清除算法(Mark-Sweep)

此算法执行分为两阶段,第一阶段从引用根节点开始标记所有被引用过的对象,第二阶段遍历整个堆,把未标记的对象清除。此算法需要暂停整个应用,同时,会产生内存碎片。

 4.标记-整理(Mark-Compact)

此算法结合了“标记清除”和“复制”两个算法的优点。也是分两阶段,第一阶段从根节点开始标记所有被引用对象,第二阶段遍历整个堆,清除未标记对象并且把存活对象“压缩”到堆的其中一块,按顺序排放。此算法避免了“标记-清除”的碎片问题,同时也避免了“复制”算法的空间问题。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值