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

为什么java的jvm堆空间要有两块幸存者区?

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

为什么java的jvm堆空间要有两块幸存者区?

问题引出

在学习jvm堆空间时,了解到堆中年轻代分为三个区域:伊甸园区和两个幸存者区,当伊甸园区满了之后会使用gc回收不再被引用的对象销毁,剩余对象在两个幸存者区之间倒腾

但是为什么要两个幸存者区,我一个幸存者区不就行了?伊甸园剩下的直接放到这个幸存者区,再加一个计数的不就行了。

原因分析

主要原因是内存碎片!何为内存碎片,就是没法使用的内存,下面来介绍一下(其实内存碎片分为内部碎片和外部碎片,这里指的是外部碎片)

内存碎片

看一个例子来理解

  1. 在幸存者区中创建了如下的几个对象
  2. 现在垃圾收集器从内存中删除了Toyota和Tesla对象,内存就变成了如下结构
  3. 假设现在需要创建一个更大的新" Truck”对象。从图中可以看出,Truck没有足够大的连续空间可以放了,那么由此造成的空间浪费成为内存碎片
full gc

当产生内存碎片时,会调用full gc来整理内存

然后就可以放了

但是我们知道,Full GC最终会导致JVM暂停较长时间,十分影响效率,因此为了解决内存碎片所带来的麻烦,再划分一个幸存者区,将gc回收之后的from幸存区倒腾到to幸存者区,就可以避免这种问题,是一种空间换时间的思路

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

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

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