JVM虚拟机03:什么是GC(垃圾回收机制)?什么是新生代和老年代?内存分代模型

24 篇文章 0 订阅
20 篇文章 0 订阅

1,什么是GC(Garbage Collection)?

GC就是垃圾回收器,在上面一篇文章中,我们说到一件事,
在一直所有垃圾回收算法里面,标记清除(Mark-Sweep),Coping(复制),标记压缩(Mark—Compact),各有特点,也各有优点,
想要进一步了解,可以这篇文章:JVM虚拟机02:学习GC回收期必备前置知识-----什么是Java的垃圾?定位垃圾方式有哪些?GC回收的清除算法有哪些?在这里就不再多说。
垃圾回收器,则是个根据各种情况,使用上述三种清除算法机制

2,看一下垃圾回收机制一种有多少种?

注意:

(1)所有垃圾回收机制,都是因为内存扩展二发展。
(2)垃圾回收机制,将内存分为的,新生代和老年代
在这里插入图片描述

3,堆堆内存逻辑分区:

(1)概念普及

(a)新生代(new):表示刚刚创建的对象的,这个时候会分配到新生区中
(b)岁数:从新生到老年过程,需要经历一次次垃圾回收,新生代对象经历多次垃圾回收,到达一定次数,即放入老年代区域,我们称一轮垃圾回收为一岁
(c)老年代:经历过多轮垃圾回收,而不会被回收的对象。
当内存满了,之后才会在老年代进行一次扫描,清理
在这里插入图片描述

(2)内存分代模型中不同年代使用垃圾回收算法:

说明:在jdk中一直支持使用分代模型吗,分代模型如上图,适用于不是很大内存回收机制

a,新生代:

在新生代中使用,Coping算法
因为在sum公司长时间统计中,发现第一次垃圾回收(YGC)会回收90%的对象,所以在实际Coping中并不是像我们前文所说的那样,分成一般,而是将内存划分为:8:1:1
为什么要分为三个区域内呢?
而不是直接9:1呢?
其实这个问题,各位玩过变量值交换就会很容易理解了,

例子:

1,创建新对象,放入eden(80%的区域)区域中,
一轮垃圾扫描之后,将eden(80%的区域)中非垃圾剩余的放到survivorA中。
将eden(80%的区域)清空。
2,创建新对象,放入eden(80%的区域),
一轮垃圾扫描之后,将eden(80%的区域)的非垃圾对象和survivorA中的对象
放入到:survivorB中。
将eden(80%的区域)和survivorA清空。
3,创建新对象,放入eden(80%的区域),
一轮垃圾扫描之后,将eden(80%的区域)的非垃圾对象和survivorB中的对象
放入到:survivorA中。
将eden(80%的区域)和survivor B清空。
如此反复
在这里插入图片描述
当survivor中装不下的话,就会转移到老年代。

b,老年代

老年代比较复杂,可能是Mark-Sweep(标记清除),Mark-Compact(标记压缩),甚至是两者组合使用。
老年代满之后就会产生FGC:
全堆范围的gc。默认堆空间使用到达80%(可调整)的时候会触发fgc。以我们生产环境为例,一般比较少会触发fgc,有时10天或一周左右会有一次
在这里插入图片描述

c,永生代(持久代)

JDK1.7之前的概念:PermGen
JDK1.8取代为元空间:Metaspace(元空间)
可参考文章:
Java8内存模型—永久代(PermGen)和元空间(Metaspace)

d,什么是YGC和FGC?

参考文章:
YGC和FGC是什么

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值