栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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是什么

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/297983.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号