【08-JVM面试专题-JVM运行时数据区堆的结构是怎么划分?为什么分代设计呢?为什么要Survivor区?只有Eden不行吗?为什么要两个Survivor区?为什么Eden:s0:s1是8:1:1】

本文主要是介绍【08-JVM面试专题-JVM运行时数据区堆的结构是怎么划分?为什么分代设计呢?为什么要Survivor区?只有Eden不行吗?为什么要两个Survivor区?为什么Eden:s0:s1是8:1:1】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

JVM运行时数据区堆的结构是怎么划分?为什么分代设计呢?为什么要Survivor区?只有Eden不行吗?为什么要两个Survivor区?为什么Eden:s0:s1是8:1:1?分配担保机制?堆内存分配过程详细的讲讲?

在这里插入图片描述

JVM运行时数据区堆的结构是怎么划分?为什么分代设计呢?为什么要Survivor区?只有Eden不行吗?为什么要两个Survivor区?为什么Eden:s0:s1是8:1:1?分配担保机制?堆内存分配过程详细的讲讲?你掌握的怎么样呢?

堆的内存布局?

一块是非堆区(方法区),一块是堆区
堆区分为两大块,一个是Old区,一个是Young区
Young区分为两大块,一个是Survivor区(S0+S1),一块是Eden区
S0和S1一样大,也可以叫From和To区

堆的内存布局

堆为什么会进行分代设计?

方法区在逻辑上又叫非堆
将内存按照对象的生命周期的长短分为Old区和Young区,
但90%+以上的对象都是朝生夕死的。
年轻代年龄为15后,去到Old区。
对象的分代年龄,存储在对象的对象头中的Markwork中。

如果细心的小伙伴就会问了,对象的结构是什么样的呢?
聪明的我早知道你要问这个问题了,所以我也早早的准备好了,我们下回分解,哈哈。。。

为什么需要Survivor区?只有Eden不行吗?

如果没有Survivor,Eden区每进行一次Minor GC,存活的对象就会被送到老年代。这样一来,老年代很快被填满,触发Major GC(因为Major GC一般伴随着Minor GC,也可以看做触发了FullGC)。
老年代的内存空间远大于新生代,进行一次Full GC消耗的时间比Minor GC长得多。
执行时间长有什么坏处?频发的Full GC消耗的时间很长,会影响大型程序的执行和响应速度。
所以Survivor的存在意义,就是减少被送到老年代的对象,进而减少Full GC的发生,Survivor的预筛选保证,只有经历16次Minor GC还能在新生代中存活的对象,才会被送到老年代。

为什么需要两个Survivor区?

为了解决Young区内存空间的不连续性、空间碎片?
将Young区继续分为Eden区和Survivor区,Survivor区分为s0和s1,
Survivor区分为俩个主要是为了能够清空另外一个空间。

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

为什么Eden:s0:s1是8:1:1?

Eden区域越小,就会不停的触发我们的GC,GC是会不断的消耗我们的性能。
新生代中的可用内存:复制算法用来担保的内存为9:1
可用内存中Eden:S1区为8:1
即新生代中Eden:S1:S2 = 8:1:1
现代的商业虚拟机都采用这种收集算法来回收新生代,IBM公司的专门研究表明,新生代中的对象大概98%是“朝生夕死”的。
这个就是一个经验值,大量的实验得出的最佳结论。

什么是分配担保机制?

一些大对象的产生,在Eden区中是没有位置存放的,这个时候会有一个担保机制的出现,Old区作为这个大对象的担保,即使这个对象的年龄是没有达到15的,依旧可以被存储到Old区中,但是,这样的大对象的产生,是非常不好的,可能会随时出发Full GC,对我们的内存空间的产生可谓是灾难性的。

对象创建后在堆中分配内存的过程?

细心一点,看一下下面这个图就会非常清晰的知道对象创建后在堆中分配内存的过程。
内存分配过程

总结:

JVM知识在面试过程中非常高频,大家一定要牢牢掌握,如果以上文章有帮助到你,希望可以点个关注,留下属于你的足迹,比心!我们下节再见哦。

这篇关于【08-JVM面试专题-JVM运行时数据区堆的结构是怎么划分?为什么分代设计呢?为什么要Survivor区?只有Eden不行吗?为什么要两个Survivor区?为什么Eden:s0:s1是8:1:1】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/384790

相关文章

Spring Boot集成/输出/日志级别控制/持久化开发实践

《SpringBoot集成/输出/日志级别控制/持久化开发实践》SpringBoot默认集成Logback,支持灵活日志级别配置(INFO/DEBUG等),输出包含时间戳、级别、类名等信息,并可通过... 目录一、日志概述1.1、Spring Boot日志简介1.2、日志框架与默认配置1.3、日志的核心作用

破茧 JDBC:MyBatis 在 Spring Boot 中的轻量实践指南

《破茧JDBC:MyBatis在SpringBoot中的轻量实践指南》MyBatis是持久层框架,简化JDBC开发,通过接口+XML/注解实现数据访问,动态代理生成实现类,支持增删改查及参数... 目录一、什么是 MyBATis二、 MyBatis 入门2.1、创建项目2.2、配置数据库连接字符串2.3、入

Springboot项目启动失败提示找不到dao类的解决

《Springboot项目启动失败提示找不到dao类的解决》SpringBoot启动失败,因ProductServiceImpl未正确注入ProductDao,原因:Dao未注册为Bean,解决:在启... 目录错误描述原因解决方法总结***************************APPLICA编

深度解析Spring Security 中的 SecurityFilterChain核心功能

《深度解析SpringSecurity中的SecurityFilterChain核心功能》SecurityFilterChain通过组件化配置、类型安全路径匹配、多链协同三大特性,重构了Spri... 目录Spring Security 中的SecurityFilterChain深度解析一、Security

SpringBoot多环境配置数据读取方式

《SpringBoot多环境配置数据读取方式》SpringBoot通过环境隔离机制,支持properties/yaml/yml多格式配置,结合@Value、Environment和@Configura... 目录一、多环境配置的核心思路二、3种配置文件格式详解2.1 properties格式(传统格式)1.

Apache Ignite 与 Spring Boot 集成详细指南

《ApacheIgnite与SpringBoot集成详细指南》ApacheIgnite官方指南详解如何通过SpringBootStarter扩展实现自动配置,支持厚/轻客户端模式,简化Ign... 目录 一、背景:为什么需要这个集成? 二、两种集成方式(对应两种客户端模型) 三、方式一:自动配置 Thick

解决pandas无法读取csv文件数据的问题

《解决pandas无法读取csv文件数据的问题》本文讲述作者用Pandas读取CSV文件时因参数设置不当导致数据错位,通过调整delimiter和on_bad_lines参数最终解决问题,并强调正确参... 目录一、前言二、问题复现1. 问题2. 通过 on_bad_lines=‘warn’ 跳过异常数据3

Spring WebClient从入门到精通

《SpringWebClient从入门到精通》本文详解SpringWebClient非阻塞响应式特性及优势,涵盖核心API、实战应用与性能优化,对比RestTemplate,为微服务通信提供高效解决... 目录一、WebClient 概述1.1 为什么选择 WebClient?1.2 WebClient 与

Java.lang.InterruptedException被中止异常的原因及解决方案

《Java.lang.InterruptedException被中止异常的原因及解决方案》Java.lang.InterruptedException是线程被中断时抛出的异常,用于协作停止执行,常见于... 目录报错问题报错原因解决方法Java.lang.InterruptedException 是 Jav

深入浅出SpringBoot WebSocket构建实时应用全面指南

《深入浅出SpringBootWebSocket构建实时应用全面指南》WebSocket是一种在单个TCP连接上进行全双工通信的协议,这篇文章主要为大家详细介绍了SpringBoot如何集成WebS... 目录前言为什么需要 WebSocketWebSocket 是什么Spring Boot 如何简化 We