首页 > 系统相关 >新生代内存需要有两个Survivor区 S0、S1

新生代内存需要有两个Survivor区 S0、S1

时间:2023-11-20 14:57:58浏览次数:32  
标签:Full Survivor Eden 对象 S1 S0 GC Minor

 

在我的上一篇博客中,介绍了JVM堆内存的结构以及在堆中进行的GC机制,链接是浅谈JAVA GC机制与性能优化

那么,在JVM的新生代内存中,为什么除了Eden区,还要设置两个Survivor区?

1 为什么要有Survivor区

先不去想为什么有两个Survivor区,第一个问题是,设置Survivor区的意义在哪里?

 

如果没有Survivor,Eden区每进行一次Minor GC,存活的对象就会被送到老年代。老年代很快被填满,触发Major GC(因为Major GC一般伴随着Minor GC,也可以看做触发了Full GC)。老年代的内存空间远大于新生代,进行一次Full GC消耗的时间比Minor GC长得多。你也许会问,执行时间长有什么坏处?频发的Full GC消耗的时间是非常可观的,这一点会影响大型程序的执行和响应速度,更不要说某些连接会因为超时发生连接错误了。

好,那我们来想想在没有Survivor的情况下,有没有什么解决办法,可以避免上述情况:

方案优点缺点
增加老年代空间 更多存活对象才能填满老年代。降低Full GC频率 随着老年代空间加大,一旦发生Full GC,执行所需要的时间更长
减少老年代空间 Full GC所需时间减少 老年代很快被存活对象填满,Full GC频率增加

显而易见,没有Survivor的话,上述两种解决方案都不能从根本上解决问题。

我们可以得到第一条结论:Survivor的存在意义,就是减少被送到老年代的对象,进而减少Full GC的发生,Survivor的预筛选保证,只有经历16次Minor GC还能在新生代中存活的对象,才会被送到老年代。

2 为什么要设置两个Survivor区

设置两个Survivor区最大的好处就是可以比较高效的解决了碎片化,下面我们来分析一下。

为什么一个Survivor区不行?第一部分中,我们知道了必须设置Survivor区。假设现在只有一个survivor区,我们来模拟一下流程:
刚刚新建的对象在Eden中,一旦Eden满了,触发一次Minor GC,Eden中的存活对象就会被移动到Survivor区。这样继续循环下去,下一次Eden满了的时候,问题来了,此时进行Minor GC,Eden和Survivor各有一些存活对象,如果此时把Eden区的存活对象硬放到Survivor区,很明显这两部分对象所占有的内存是不连续的,也就导致了内存碎片化。

 

ps:产生内存碎片化问题,那么我单独再采用一次整理算法也可以解决碎片化问题,而为什么没有采用算法,而是采用了使用两块survivor,实际上还是考虑到整理空间所消耗的性能远远大于使用两块survivor通过复制算法解决


我绘制了一幅图来表明这个过程。其中色块代表对象,白色框分别代表Eden区(大)和Survivor区(小)。Eden区理所当然大一些,否则新建对象很快就导致Eden区满,进而触发Minor GC,有悖于初衷。


一个Survivor区带来碎片化

碎片化带来的风险是极大的,严重影响JAVA程序的性能。堆空间被散布的对象占据不连续的内存,最直接的结果就是,堆中没有足够大的连续内存空间,接下去如果程序需要给一个内存需求很大的对象分配内存。。。画面太美不敢看。。。这就好比我们爬山的时候,背包里所有东西紧挨着放,最后就可能省出一块完整的空间放相机。如果每件行李之间隔一点空隙乱放,很可能最后就要一路把相机挂在脖子上了。

那么,顺理成章的,应该建立两块Survivor区,刚刚新建的对象在Eden中,经历一次Minor GC,Eden中的存活对象就会被移动到第一块survivor space S0,Eden被清空;等Eden区再满了,就再触发一次Minor GC,Eden和S0中的存活对象又会被复制送入第二块survivor space S1(这个过程非常重要,因为这种复制算法保证了S1中来自S0和Eden两部分的存活对象占用连续的内存空间,避免了碎片化的发生)。S0和Eden被清空,然后下一轮S0与S1交换角色,如此循环往复。如果对象的复制次数达到16次,该对象就会被送到老年代中。下图中每部分的意义和上一张图一样,就不加注释了。

 两块Survivor避免碎片化


上述机制最大的好处就是,整个过程中,永远有一个survivor space是空的,另一个非空的survivor space无碎片。

那么,Survivor为什么不分更多块呢?比方说分成三个、四个、五个?显然,如果Survivor区再细分下去,每一块的空间就会比较小,很容易导致Survivor区满,因此,我认为两块Survivor区是经过权衡之后的最佳方案。

 

转载:https://blog.csdn.net/antony9118/article/details/51425581

 

标签:Full,Survivor,Eden,对象,S1,S0,GC,Minor
From: https://www.cnblogs.com/softidea/p/17843926.html

相关文章

  • 14_DS1302实时时钟
    DS1302实时时钟介绍引脚定义和应用电路内部结构框图寄存器定义时序定义BCD码LCD1602显示年月日时分秒星期信息DS1302.c#include<REGX52.H>#include"DS1302.h"sbitDS1302_SCLK=P3^6;sbitDS1302_IO=P3^4;sbitDS1302_CE=P3^5;#defineDS1302_SECOND0x80......
  • 51时钟实验——DS1302芯片
    关于DS1302芯片:1、引脚说明: Vcc1:主电源;Vcc2:备份电源。当Vcc2>Vcc1+0.2VVcc2>Vcc1+0.2VVcc2>Vcc1+0.2VVcc2>Vcc1+0.2V时,由Vcc2向DS1302供电,当Vcc2<Vcc1时,由Vcc1向DS1302供电。SCLK:串行时钟,输入,控制数据的输入与输出;I/O:三线接口时的双向数据线;CE:输入信号,在读、写数据期......
  • DS145-16A-ASEMI整流二极管DS145-16A
    编辑:llDS145-16A-ASEMI整流二极管DS145-16A型号:DS145-16A品牌:ASEMI封装:TO-247特性:插件、整流二极管正向电流:45A反向耐压:1600V恢复时间:ns引脚数量:2芯片个数:1芯片尺寸:84MIL浪涌电流:150A漏电流:10ua工作温度:-55℃~150℃包装方式:500/盘;5000/箱备受欢迎的DS145-16A-ASEM......
  • (08)类似Excel数据透视表功能的DBCross1
    其他参考(09)打印StringGrid第3步 如对name分组计数 ......
  • 启动open5GS的核心网和srsLTE的enodeB时遇到报错S1-Setup failure Cannot find Served
    问题的场景启动open5GS的核心网和srsLTE的enodeB、ue,遇到报错S1-SetupfailureCannotfindServedTAI,导致enodeB连接不上mme。报错信息S1-SetupfailureCannotfindServedTAICheck'mme.tai'configurationCause:misc-unknown-PLMN报错原因mme配置的PLMN和enodeB配......
  • 无U盘双系统安装(Windows10安装Ubuntu)
    1,下载Ubuntu镜像 ubuntu,Windows镜像下载-Zcb0812-博客园(cnblogs.com)2,下载easyuefi 轻松管理EFI/UEFI启动项&管理EFI系统分区&修复EFI系统启动问题!-EasyUEFI3,Win10电脑新建分区(10G),类型选择FAT32,用于安装Ubuntu启动程序,并将第一步的镜像解压到此盘中4,使用easyu......
  • windows10 使用 USB 无线网卡的热点功能
    一、概述在某宝上买了一个COMFASTCF-727B的无线模块,由于笔记本电脑一直使用不上,所以放了很久。多年后我来到了一个公司,遇到了我此生最想吐槽的网管,简直不敢想象几十人的办公室,居然能把热点给占满,于是我找到了IT人员,得的回复是公司手机太多,特此还把一部分手机给禁用了,那理直气......
  • Windows10+VisualStudio2022+CMake+Qt开发环境搭建
    一、概述之前一直使用QtCreator当做QT的开发工具,也没觉得有啥问题。最近使用了VisualStudio+Cmake写了一些SDL2和FFmpeg的东西感觉这个VisualStudio这个工具挺好用的。就萌生了要使用VisualStudio开发Qt的想法。有了这个想法之后就想着需要搭建一个开发环境。百度搜索了......
  • ros1 py2和py3 编译
    2.4、编译相关准备做好了之后,就对其进行编译,创建该动作实际使用的代码以及类定义:cd~/catkin_wscatkin_make其中对于编译也可以指定Python版本:cd~/catkin_wscatkin_make-DPYTHON_EXECUTABLE=/usr/bin/python2cd~/catkin_wscatkin_make-DPYTHON_EXECUTABLE=/usr/bin/python3......
  • Windows10上安装Mosquitto的步骤(win10、win11 安装mqtt)
    目录· 前言· 1.下载安装· 2.设置Broker的IP和Port· 3.设置账户和密码· 4.重启服务mosquittobroker· 5.如何让Windows服务开机自启前言mosquitto是一款开源免费的软件,官网链接。它是一些可执行文件的集合,通过这些可执行文件,它提供broker,publish,subscribe功能......