JVM面试真题总结(十三)

文章收录在网站:http://hardyfish.top/

文章收录在网站:http://hardyfish.top/

文章收录在网站:http://hardyfish.top/

文章收录在网站:http://hardyfish.top/

在这里插入图片描述

JVM的堆内存如何分区?

从垃圾收集(Garbage Collection,GC)的角度看

Java堆(Heap)主要被划分为以下几个区域:

新生代(Young Generation):

  • 新生代是存放新创建的对象的地方。
  • 新生代又被分为三个部分:
    • 一个Eden区和两个Survivor区(Survivor 0Survivor 1)。
    • 大部分情况下,新创建的对象首先被分配到Eden区。

老年代(Old Generation):

  • 当对象在新生代中存活时间较长,或者Survivor区无法容纳的时候,就会被移动到老年代。
    • 老年代的空间一般比新生代大,用于存放生命周期较长的对象。

持久代(Permanent Generation)或元空间(Metaspace):

  • 这部分内存主要用于存放JVM加载的类信息、常量、静态变量等数据。
  • 在Java 8中,持久代被废弃,改为使用元空间,元空间使用的是本地内存。

JVM的垃圾收集器主要根据对象所在的区域进行垃圾回收。

新生代中的垃圾收集称为Minor GC,这种垃圾收集的频率较高,但每次收集的时间较短。

老年代中的垃圾收集称为Major GCFull GC,这种垃圾收集的频率较低

  • 但每次收集的时间较长,可能会导致应用的暂停。

总的来说,从GC的角度看,Java堆主要被划分为新生代、老年代和持久代(或元空间)

  • 不同的区域对应不同的垃圾收集策略。

新生代为什么要进一步分为Eden和Survivor区?

新生代将内存分为一个Eden区和两个Survivor区(S0和S1,也称为From和To区)的目的:

  • 是为了实现一种称为分代复制算法Generational Copying Algorithm)的垃圾收集策略
    • 从而提高垃圾回收的效率。

分代复制算法的基本思想是将新创建的对象分配到Eden区,当Eden区满时,触发一次Minor GC。

  • 在这次垃圾回收过程中,JVM会检查Eden区的对象
    • 将仍然存活的对象复制到一个Survivor区(例如:S0区),同时清空Eden区。
    • 之后,新创建的对象仍然分配到Eden区。

当下一次Minor GC发生时,JVM会再次检查Eden区和已经存有对象的Survivor区(例如:S0区)

  • 将仍然存活的对象复制到另一个Survivor区(例如:S1区)
    • 同时清空Eden区和之前的Survivor区(例如:S0区)。
  • 这个过程会反复进行,直到某个对象在Survivor区中经历了一定次数的复制
    • 由JVM参数-XX:MaxTenuringThreshold设置
    • 这个对象就会被认为是长寿对象,会被移动到老年代。

采用这种分代复制算法的好处在于:

减少内存碎片:

  • 每次GC时,存活对象都被复制到另一个Survivor区,保持内存的连续性,减少内存碎片。

提高GC效率:

  • 由于大部分新创建的对象都会很快变得不可达
    • 所以很少有对象需要从Eden区复制到Survivor区,这使得Minor GC的效率很高。

延长老年代GC间隔:

  • 分代复制算法可以有效地过滤掉生命周期短的对象
    • 只有经过多次复制仍然存活的对象才会被移动到老年代,这有助于减少老年代的垃圾回收频率。

总之,将新生代分为Eden区和两个Survivor区是为了实现分代复制算法

  • 从而提高垃圾回收的效率,减少内存碎片,以及延长老年代的垃圾回收间隔。

新生代各个分区的默认空间比例是怎样的?

在HotSpot虚拟机中,新生代(Young Generation)的默认内存划分比例是:

  • Eden区:
    • 占新生代总空间的8/10,也就是80%。
  • Survivor区:
    • 两个Survivor区(Survivor 0Survivor 1)各占新生代总空间的1/10,也就是10%。

也就是说,Eden区和两个Survivor区的默认比例大约是8:1:1

这个比例可以通过JVM的参数-XX:SurvivorRatio来调整。

  • 例如,如果你希望Eden区和Survivor区的比例是6:1:1,可以设置-XX:SurvivorRatio=6

这个默认比例是基于经验得出的,大多数情况下,新创建的对象会很快变得不可达并被回收

  • 所以Eden区被分配了更多的空间。

  • 而Survivor区的空间较小,主要用于存放从Eden区复制过来仍然存活的对象。

需要注意的是,虽然两个Survivor区的总空间占新生代的2/10

  • 但在任何时候,两个Survivor区只有一个被使用,另一个是空闲的。

这是因为在进行Minor GC时,存活的对象会在两个Survivor区之间来回复制。

例如,一次GC后,存活对象被复制到Survivor 0,下一次GC时

  • 存活对象会被复制到Survivor 1,Survivor 0则被清空。

描述对象何时会从新生代晋升到老年代

存活对象会在以下情况下进入老年代:

年龄达到阈值:

  • 在新生代中,每个对象都有一个年龄计数器。
    • 当对象在Survivor区中经历一次Minor GC后,其年龄就会增加1。
    • 当对象的年龄达到一定的阈值:
      • 默认值是15,可通过-XX:MaxTenuringThreshold参数设置,就会被晋升到老年代。
    • 这个阈值可以通过虚拟机参数-XX:MaxTenuringThreshold来设定。

Survivor空间不足:

  • 在进行Minor GC时,如果Survivor空间不足以容纳Eden区和Survivor区中所有存活的对象
    • 那么大于等于某个年龄的对象会直接被移动到老年代,这个年龄阈值会动态调整
    • 以使得Survivor区能够容纳下其他存活对象。

动态对象年龄判定:

  • 如果Survivor区中相同年龄所有对象大小的总和大于Survivor空间的一半,
    • 年龄大于等于该年龄的对象就可以直接进入老年代,无须等到-XX:MaxTenuringThreshold设定的年龄。

大对象直接进入老年代:

  • 大对象是指需要大量连续内存空间的Java对象,如很长的字符串或者数组。
  • 大对象会直接被分配到老年代,这是因为对大对象进行复制回收,存活率高的情况下
    • 会产生大量的内存复制操作,效率相对较低。

这些策略的目的是尽可能将生命周期长的对象提前移入老年代,减少新生代的GC次数,提高系统的运行效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/144196.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

日志框架的使用

一、日志概述 日志:用来记录程序运行过程中的信息,并可以进行永久存储。 开发过程中可能会出现以下需求: 希望系统能记住某些数据是被谁操作的,比如被谁删除了?想分析用户浏览系统的具体情况,以便挖掘用…

systemd学习

传统init进程启动流程 kernel内核代码init/main.c,内核启动init进程过程: init进程是由内核启动的第一个(也是唯一的一个)用户进程(进程id为1),它根据配置文件决定启动哪些程序,ini…

我的AI工具箱Tauri版-VideoClipMixingCut视频批量混剪

本教程基于自研的AI工具箱Tauri版进行VideoClipMixingCut视频批量混剪。 VideoClipMixingCut视频批量混剪 是自研AI工具箱Tauri版中的一款强大工具,专为自动化视频批量混剪设计。该模块通过将预设的解说文稿与视频素材进行自动拼接生成混剪视频,适合需要…

【Finetune】(二)、transformers之Prompt-Tuning微调

文章目录 0、prompt-tuning基本原理1、实战1.1、导包1.2、加载数据1.3、数据预处理1.4、创建模型1.5、Prompt Tuning*1.5.1、配置文件1.5.2、创建模型 1.6、配置训练参数1.7、创建训练器1.8、模型训练1.9、推理:加载预训练好的模型 0、prompt-tuning基本原理 prompt…

【论文阅读】FedABC: Targeting Fair Competition in Personalized Federated Learning

论文链接(AAAI2023) 文章解决的问题主要是NO-IID问题。 文章的方法包括几个关键的技术和策略,具体如下: 二元分类框架: FedABC利用二元分类的训练策略来解决每个类别的个性化问题。这意味着对于每个类别都训练一个独立…

初识 C++ ( 1 )

引言:大家都说c是c的升级语言。我不懂这句话的含义后来看过解释才懂。 一、面向过程语言和面向对象语言 我们都知道C语言是面向过程语言,而C是面向对象语言,说C和C的区别,也就是在比较面向过程和面向对象的区别。 1.面向过程和面向…

JDBC 编程

目录 JDBC 是什么 JDBC 的工作原理 JDBC 的使用 引入驱动 使用 常用接口和类 Connection Statement ResultSet 使用总结 JDBC 是什么 JDBC(Java Database Connectivity):Java数据库连接,是一种用于执行 SQL 语句的Java…

‍♀️焦虑症患者的救赎之路:这5项运动让你重拾宁静与力量!

在这个快节奏、高压力的时代,焦虑症已成为许多人难以言说的秘密。它像一张无形的网,悄悄侵蚀着我们的心灵,让我们在日复一日的焦虑中挣扎。然而,你知道吗?运动,这一简单而强大的自然疗法,正是我…

强化信息安全:密码机密钥管理的策略与实践

强化信息安全:密码机密钥管理的策略与实践 随着信息技术的飞速发展,信息安全已成为企业和社会关注的焦点。密码机作为加密通信和数据保护的关键设备,其密钥管理直接关系到整个信息系统的安全性。本文旨在探讨密码机密钥管理的策略与实践&…

Java 实现桌面烟花秀

前言 今天,我们将展示如何使用 Java Swing 创建一个烟花效果,覆盖整个桌面。我们将重点讲解如何在桌面上展示烟花、如何实现发射和爆炸效果,以及如何将这些效果整合到一个完整的程序中。 效果展示 如上图所示,我们在桌面实现了&…

深入解析ThingsBoard与ThingsKit物联网平台的差异

VS 在物联网(IoT)领域,平台的选择对于企业来说至关重要。本文将深入探讨ThingsBoard社区版与ThingsKit企业版这两个物联网平台的差异,帮助读者更好地理解它们的特色和适用场景。 系统相同点 首先,ThingsBoard社区版和ThingsKit企业版都基于…

Flink1.18.1 Standalone模式集群搭建

Flink1.18.1 Standalone模式集群搭建 Flink1.18.1 Standalone模式集群搭建1. 环境准备1.1 Flink下载地址1.2 集群角色分配 2. Flink 集群安装步骤2.1 下载并解压 Flink2.2 解压安装包2.3 配置环境变量2.4 配置 SSH 免密登录 3. 配置 Flink 集群3.1 修改 flink-conf.yaml 配置文…

Day99 代码随想录打卡|动态规划篇--- 01背包问题

题目(卡玛网T46): 小明是一位科学家,他需要参加一场重要的国际科学大会,以展示自己的最新研究成果。他需要带一些研究材料,但是他的行李箱空间有限。这些研究材料包括实验设备、文献资料和实验样本等等&am…

【linux008】目录操作命令篇 - rmdir 命令

文章目录 1、基本用法2、常见选项3、举例4、注意事项 rmdir 是 Linux 系统中的一个命令,用于删除空目录。它只能删除 空目录,如果目录中存在文件或子目录,则无法删除。 1、基本用法 rmdir [选项] 目录名...2、常见选项 -p, --parents&…

Linux标准IO-系统调用详解

1.1 系统调用 系统调用(system call)其实是 Linux 内核提供给应用层的应用编程接口(API),是 Linux 应用层进入内核的入口。不止 Linux 系统,所有的操作系统都会向应用层提供系统调用,应用程序通…

在 Windows 上恢复已删除的 PDF 文件的最佳方法

如果您不小心删除了 PDF 文件或由于系统突然崩溃而无法再找到它们,本指南介绍了恢复已删除文件的最佳方法。 帖子中列出的方法简单、有效且可行。我们在列出它们之前对其进行了测试。 什么是 PDF,Adobe 将未保存的 PDF 存储在哪里? 自从 Ad…

无损转换:严选4个视频mkv转mp4格式的方法

视频的mkv格式是较为清晰的视频格式,但越清晰的视频格式所占的设备内存也就越大,从而也可能会出现视频传输失败、播放卡顿等的问题。对此,我们可以将视频转换为体积较小的格式来解决上述问题,如mkv转mp4。接下来,小编就…

实战讲稿:Spring Boot整合MyBatis

文章目录 实战讲稿:Spring Boot整合MyBatis课程目标课程内容1. 创建员工映射器接口1.1 创建子包1.2 创建接口 2. 测试员工映射器接口2.1 自动装配员工映射器2.2 测试按标识符查询员工方法2.3 测试查询全部员工方法2.4 测试插入员工方法2.5 测试更新员工方法2.6 测试…

『玉竹』基于Laravel 开发的博客、微博客系统和Android App

基于 Laravel 和 Filament 开发, 使用 Filament 开发管理后台,前端比较简洁。 博客大家都清楚是什么东西,微博客类似于微博之类的吧,有时候想要写的东西可能只有几句话,想要起个标题都不好起。 为了是微博客功能更好用&#xff0c…

通信工程学习:什么是ONT光网络终端

ONT:光网络终端 ONT(Optical Network Terminal,光网络终端)是光纤接入网络(FTTH)中的关键设备,用于将光纤信号转换为电信号或将电信号转换为光信号,以实现用户设备与光纤网络的连接。…