【小记】为什么jvm的新生代要分为一个Eden和两个Survivor

JVM中新生代内存为什么需要两个Survivor区? 当进行Minor GC时,将存活的对象复制到空闲的Survivor区,同时清空正在使用的Survivor区。这样,下一次Minor GC时,可以直接使用上一次空闲的Survivor区,避免了对存活对象的复制操作,提高了垃圾回收的效率。新生代主要用于存储新创建的对象。这样,在进行Minor GC时,可以将存活的对象复制到空闲的Survivor区,而不需要考虑内存碎片化的问题。当下一次Minor GC发生时,Survivor空间中的对象将被复制到另一个空闲的Survivor区,同时将这些对象的年龄加一。 阅读详情

2021-03-12

现在的JVM的新生代内存中,除了Eden区,还有两个Survivor区。那为什么要这样设置呢?
这和新生代的垃圾回收算法是息息相关的。

复制算法

复制算法是新生代的垃圾收集收集算法,基本思路是将新生代分为两个大小一样的内存区域,每次新对象会放置在其中的一块区域内。当该区域的大小不足以继续分配对象时,此时就会促发Minor GC,首先将存活的对象标记出来,然后将存活的对象转移到另一块内存区域中,这样可以比较紧凑地将对象排列在一起,减小了内存碎片。同时之前那块内存可以一次回收掉所有的对象。
复制算法主要是减少了内存碎片
但是每次只能用一半的新生代,对内存的使用效率太低了!

复制算法的优化:Eden区和Survivor区

其实大多数对象存活周期非常短的,可能一次新生代垃圾回收,99%的对象都被回收了,所以真正的复制算法会进行优化,把新生代内存分为三块:一块Eden区和两块Survivor区。比例可以是8:1:1
平时对象的分配都是分配在Eden区,当Eden区快满时触发垃圾回收,将存活的对象转移到其中一块Survivor区中,然后对Eden区进行清除。等到Eden区再次填满时,Eden区域的存活对象和使用过的Survivor区域的存活对象转移到空的Survivor区域中,然后清除Eden区和之前的Survivor区。就这样始终保存一块Survivor是空的等待接受存活对象,循环使用三块内存。这样可用内存就变成了90%,而不是之前的50%
这也就是为什么新生代要划分为三块区域,这样做既能减少内存碎片,也能提高内存的使用效率。

【STM32】BLDC驱动&控制开发笔记 | 07_SPI通信测试 - STM32F407用SPI配置DRV8323驱动芯片 使用STM32F407的SPI通信功能配置DRV8323S驱动芯片的详细过程说明。 阅读详情

相关推荐

[Vue][面试]谈谈你对MVC、MVP和MVVM的理解

谈谈你对MVC、MVP和MVVM的理解 答题思路:此题涉及知识点很多,很难说清楚,说透彻,因为MVC,MVP这些我们前端程序员自己甚至都没用过。但是恰恰反映了前端这些年从无到有, 从有到优的变迁过程,因此沿此思路回答将十分清除。 Web1.0时代 在web1.0时代,并没有前端的概念。开发一个web应用多数采用ASP.NET/Java/PHP编写,项目通常由多个aspx/jsp/php文件构成,每个文件中同时包含了HTML、CSS、JavaScript、C#/Java/PHP代码, 系统整体架构可能如下图所

你好,欢迎光临! 723

JVM面试题

1. JVM内存结构 Java堆:存放对象实例 方法区:存储已被虚拟机加载的类信息、常量、静态变量 程序计数器:当前线程所执行的字节码的行号指示器 JVM栈:虚拟机栈描述的是Java方法的执行的内存模型,每个方法被执行的时候都会同时创建一个栈帧(Stack Frame)用于存储局部变量表、操作栈、动态链接、方法出口等信息。 本地方法栈:调用本地的native方法。 2. Java堆的结构是什么样子的?什么是堆中的永久代 JVM的堆是运行时数据区,所有类的实例和数组都是在堆上分配内存。它在JVM启动的

小小学渣的博客 1109

纽马克-贝塔法(Newmark-Beta Method)在结构动力学中的应用与实现

本文深入解析了纽马克-贝塔法(Newmark-Beta Method)在结构动力学数值计算中的核心原理与应用。作为经典的时间积分算法,它通过调节γ和β参数,在计算精度、稳定性与效率间取得平衡,尤其适用于地震响应、风振分析等工程场景。文章详细阐述了其数学内核、在有限元分析中的实现步骤,并对比了隐式与显式方案的适用场景,为工程师提供了关键的方法选择与参数调优指导。

weixin_29232121的博客 148

jvm的新生代为什么要分成eden区、s0区和s1区

在JVM的垃圾回收机制中,新生代(Young Generation)被进一步划分为三个区域:Eden区、S0区(Survivor 0,又称From Survivor区)和S1区(Survivor 1,又称To Survivor区)。这种逐步晋升的机制有助于过滤掉生命周期较短的对象,将生命周期较长的对象才转移到老年代,以减少老年代的垃圾回收压力。总结来说,JVM将新生代划分为Eden区、S0区和S1区,是为了提高垃圾回收效率,避免内存碎片化,并有效地管理对象的生命周期,确保老年代不会过早被填满。

u012534547的博客 1494

envi5.3处理高分二号影像数据详细过程记录

全文根据此篇文章进行数据处理: tm影像辐射定标_高分二号影像数据预处理及裁剪过程 其他参考: 学习笔记---遥感影像辐射定标与大气校正 利用ENVI自带全球DEM数据计算区域平均高程 高分二号数据处理流程(有高分二号的数据信息) GF2有多光谱和全色两个数据,MSS是多光谱的,PAN是全色的,多光谱的分辨率低,全色的高,需要把这两个数据融合,融合之前需要做定标等处理,获取经纬度。 一、多光谱影像处理 1. 辐射定标 以这个为例: 其他路径\2022.4.2...

ligous的博客 5万+

自动驾驶仿真(二)—— 基于PreScan与Simulink的联合仿真

自动驾驶仿真软件介绍二—— PreScan与Simulink联合仿真1. Prescan仿真软件2. Prescan与Simulink联合仿真2. 1 Prescan和matlab软件安装2. 2 联合仿真配置3. 联合仿真实例3.1 一辆不按法规行驶的小车3.2 另一辆的正常行驶的小车3.3 视觉辅助摄像机3.4 传感器检测4. 系列学习视频教程5. 参考学习的书目教材 上一篇博文简单介绍了Carsim与Simulink联合仿真,接着这篇就再继续简单介绍另一款自动驾驶仿真软件Prescan,并且简单做个P

zhudj08的博客 1万+

垃圾回收机制

堆内存的分配与回收 由于目前收集器都采用分代算法,因此Java堆可以分为新生代和老年代。 分代回收原理:对象首先被分配在新生代,经历过垃圾回收后若仍存活,则移到老年代。但这样老年代很快会被填满,导致触发Major GC,性能受影响。 于是将新生代分为Eden区和Survivor区,Eden满时触发Minor GC,将存活的对线移至Survivor区。这样直到对象经历过一定次数的回收仍存活时,才将其移到老年代,这样就减少了Major GC(可视为Full GC)。 那为什么要设置俩Survivor区?答案是

Silentic 537

从零到一:手把手教你用Verilog在FPGA上构建自己的FFT处理器(不依赖IP核)

本文详细介绍了如何从零开始使用Verilog在FPGA上构建256点FFT处理器,不依赖商业IP核。内容涵盖FFT算法基础、蝶形运算单元设计、整体架构实现、时序收敛优化策略以及测试验证方法,重点提升FPGA上算法部署的运行效率与资源利用率。

vv45678的博客 822

深入理解JVM——(三)为什么JVM新生代需要两个Survivor区

经过了JVM区域的学习,我们知道在堆中新生代具有一个Eden区和两个Survivor区,这里就有疑问了,为什么需要Survivor区和为什么需要两个Survivor区?带着疑问我们思考一下。 一、为什么需要Survivor区? 带着这个问题,我们假设一下,如果没有Survivor区,新生代只有Eden区。 当Eden区装满后,Minor GC进行垃圾回收,幸存的对象会直接放入老年代,可以想到,...

PAcee1的博客 2160

【前端基础篇】HTML5 + CSS3 入门知识

,HTML5和CSS3核心知识

前端知识分享喵 2982

华为OD机试真题 新系统【查找能被整除的最大整数】

华为OD新系统机试真题【查找能被整除的最大整数】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【查找能被整除的最大整数】

qq_45776114的博客 673

Java的JVM内存模型小记

前两天参加了网络安全创新大会,加上昨晚在b站看张博大佬直播修fastjson的bug,趁着这两天项目结束闲下来了,重新探索了一下jvm相关的一些知识,感觉挺有意思的。上午使用jps,jstat,jmap等命令玩了一阵子,发现虽然可以达到效果但是命令行的数据化可读性很差,今天下午终于get到了一个不错的工具jconsole.exe,可以提供可视化的JVM先关的数据监控和管理。 其实java本身是提...

You_are_my_Mr_Right的博客 317

安装keil软件时安装不了芯片包怎么回事?芯片包安装路径放在Keill里的packs下面,弹框提示报错:Errors retumned from cpackget...如何解决?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 2207

每周小记——JVM

本文剖析JVM核心机制:详述内存模型(堆、方法区、栈)及垃圾回收算法(标记-清除/复制/压缩)、分代策略与GC类型(Minor/Major/FullGC);解析类加载机制(双亲委派模型、加载/链接/初始化过程及三类加载器差异);阐述执行引擎(JIT编译、热点探测、逃逸分析);对比现代收集器(G1/ZGC/Shenandoah)及CMS优劣;探讨性能调优关键(吞吐量与延迟平衡、内存分配策略)。为Java性能优化提供理论支撑。

weixin_57655687的博客 1583

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

jvm小记

jvm

渡鸦的博客 176

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

JVM学习小记

jvm学习小记

逆流的博客 328

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

【冲刺大厂P6专题】JVM内存为什么要分成新生代,老年代,持久代?新生代中为什么要分为Eden和Survivor?

需要先了解区域分配 目录 1)共享内存区划分 2)为什么分年老代和新生代 3)为什么要分为Eden和Survivor?为什么要设置两个Survivor区? 1)共享内存区划分 1.共享内存区 = 持久代+ 堆(注;jdk1.8及以上jvm废弃了持久代) 2.持久带代= 方法区 + 其他 3.Java堆 = 老年代 + 新生代 4.新生代 = Eden(伊甸区) + S1(幸存1) + S2(幸存2) 2)为什么分年老代和新生代 1)新生代(Young Gen):年...

illovesoftware的博客 2658

新生代Eden与两个Survivor区的解释

文章出处:http://ifeve.com/jvm-yong-generation/ 聊聊JVM的年轻代 1.为什么会有年轻代 我们先来屡屡,为什么需要把堆分代?不分代不能完成他所做的事情么?其实不分代完全可以,分代的唯一理由就是优化GC性能。你先想想,如果没有分代,那我们所有的对象都在一块,GC的时候我们要找到哪些对象没用,这样就会对堆的所有区域进行扫描。而我们的很多对象都是朝生夕

lojze_ly的博客 6万+

java:jvm:JVM堆区新生代为什么有两个Survivor

JVM内存模型中, Heap区被分为新生代和老年代两个区域, 新生代又分为Eden+Survivor1+Survivor2. 新生代收集算法主要使用复制算法, 老年代收集算法主要使用标记-清理或标记-整理算法。 堆内存划分 新生代在发生首次YGC的时候, Eden内存活的对象会被复制到S1。 再发生YGC的时候, Eden内存活的对象和S1内存活的对象会被复制到S2, 同时清除Eden内的对象和S1内的对象. 再发生YGC的时候, Eden内存活的对象和S2内存活的对象会被复制到S.

不花的花和尚的博客 1428

新生代内存中为什么要有两个survivor区

首先是关于新生代中的内存分布的描述: 新生代中的对象都是“朝生夕死”的对象,所以每次gc存活的对象很少,于是在新生代中采用的垃圾回收算法是“复制算法”。 将新生代的内存分为一块较大的Eden区域和两块较小的Survivor区域。每次使用Eden和其中一块Survivor空间。回收的时候,将Eden和Survivor中还存活着的对象一次性地复制到另一块空间上,最后清理Eden和刚才用过...

weixin_30782331的博客 625

JVM 内存为什么要分成新生代,老年代,持久代。新生代中为什么要分为 Eden 和 Survivor。

JVM将内存分为不同的代(Generation)是为了更有效地管理内存和优化垃圾回收。

NZC2237的博客 414

JVM中的新生代和老年代(Eden空间、两个Survior空间)

现有的主流JVM分别是HotSpot和JRockit,主要研究对象也是这两个。这篇文章里,我们只研究HotSpot,也就是所谓的Sun JVM。目前阶段,Sun的GC方式主要有CMS和G1两种。考虑到效果和实际应用,这里只介绍CMS。CMS,全称Concurrent Mark Sweep,是JDK1.4后期版本开始引入的新GC算法,在JDK5和JDK6中得到了进一步改进,它的主要适合场景是对响应时...

样young的博客 6万+

《JAVA核心知识》学习笔记(JVM)-1

JVM (1) 基本概念: JVM 是可运行 Java 代码的假想计算机 ,包括一套字节码指令集、一组寄存器、一个栈、 一个垃圾回收,堆 和 一个存储方法域。 JVM 是运行在操作系统之上的,它与硬件没有直接 的交互 Hotspot JVM 后台运行的系统线程主要有下面几个: ...

chongyi1654的博客 497

0107 JVM内存区域划分Eden Space、Survivor Space、Tenured Gen,Perm Gen解释

jvm区域总体分两类,heap区和非heap区。heap区又分:Eden Space(伊甸园)、Survivor Space(幸存者区)、Tenured Gen(老年代-养老区)。 非heap区又分:Code Cache(代码缓存区)、Perm Gen(永久代)、Jvm Stack(java虚拟机栈)、Local Method Statck(本地方法栈)。 HotSpot虚拟机GC算法采用分

junlinbo的专栏 1455

Young区与YGC

Young区             Young区被划分为一个Eden区和两个Survivor区。Eden区存放新创建的对象,一个Survivor区存放YGC后存活的对象,另一个为空。为什么分区?  原因:让真正长期存活的对象进入Old区,降低FGC频率。如果不分区,Young区一旦被占满就触发YGC,存活对象进入Old区,即只要能经历一次YGC即可进入Old区,增加了FGC频率。为什么存在两个S

04stone37 1278

为什么垃圾回收要区分Eden区和survivor区?

3.放入到survivor区,在s0区或者s1区存活下来的对象,都放入到另一个区域中。5.minor gc他的回收速度是非常快的,而老年代垃圾回收时间比较长。6.区分eden区和survivor区就是为了更好的实现分代收集算法。2.在eden区先创建对象,被minor gc一次后,存活下来的对象。7.通过将不同的年龄对象,分配到不同的区域,提高垃圾回收的效率。4.来回复制,当他的gc年龄达到15次之后,就放入到老年代。1.jvm采用的是分代收集算法,新生代使用复制算法。

qq_21277357的博客 335
上一篇: 【小记】如何保证缓存和数据库的一致性
下一篇: 最近的记录
皮皮蟹01
博客等级 码龄10年 29粉丝 76原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值