JVM内存模型最新面试题(持续更新)

问题:java中创建的对象一般放在哪里?(全流程包含从创建到回收)

回答

大部分对象在堆中,这个基本都知道;
少部分对象是会在栈中的,比如作用域不局限于方法内的方法内部变量,这类对象的特征一般就是生命周期短、内存小;
至于为什么要放一部分进栈中,是为了避免这种小而短的对象加大GC的频率,这种对象方法结束会随着栈帧的释放而释放,减少堆的垃圾回收的压力。
在jdk1.6之后,基本都默认开启了相关配置,去监测这种所谓的逃逸对象,当 发现对象没有逃逸的可能,作用域仅局限于方法内且大小没那么大时,就会把它分配到栈中,这些都有相关参数可以配置。

问题:讲了栈中的对象,那你讲讲放入堆中的对象一般是怎么处理的?

回答

在这里插入图片描述

常规情况下,我们创建的对象,都默认是生命周期比较短的,优先分配在年轻代的Eden区。
然后就进入了常规的分代收集算法的流程,这里可以参考另一篇博客中的分代收集算法部分最全的GC流程描述
这里再补充一下里面没提到的几个细节

  1. 为什么默认年龄是15? 在程序编程中,15是个很敏锐的数字,因为是2^4-1,也就是4个比特位所能表达的对象大小。事实上,java对象头上存储分代年龄的长度确实就是4bit,详见多线程原理之synchronized锁的原理
  2. 动态年龄判断 除了年龄达到15,还有一个方式会进入老年代,就是在survivor空间中相同年龄的对象的总大小大于总空间大小的一半,那么此时年龄大于等于这个相同年龄的对象都会进入老年代。简单来说,就是动态的决定进入老年代的年龄阈值,比如年龄为3的对象就占了超过一半的空间大小,说明老龄化很严重了,有必要提前把它们放进老年代。
  3. 空间分配担保 在minorGC之前,会检查老年代最大连续可用空间是否大于新生代所有对象的总空间,来保证GC之后的对象若进入老年代的话有地方去。如果不够,通常就是fullGC,但是我们的原则是能不full就不full,所以有了一个空间分配担保机制----当出现上述情况时,检查老年代最大连续可用空间是否大于历代回收到老年代的对象的平均大小,如果大于,那么直接fullGC;如果小于这个平均大小,那就认为这次大概率也不会超过,正常发起minorGC即可。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript对象设计哲学:八种模式塑造高效代码

🔥 个人主页:空白诗 文章目录 一、引言 🚀二、Object 构造函数 🧱📌 基本用法📌 重要性📌 实际应用案例 三、对象字面量 📘📌 定义属性📌 定义方法&#x1f4…

2.2、Gitea忘记密码重置密码

忘记密码后,管理员可以使用gitea的主程序输入命令重置密码。 gitea admin user change-password --username myname --password asecurepassword

工业派-配置Intel神经计算棒二代(NCS2)

最近两天在工业派ubuntu16.04上配置了Intel神经计算棒二代——Intel Neural Compute Stick,配置过程之艰辛我都不想说了,实在是太折磨人。不过历尽千辛万苦,总算让计算棒可以在工业派ubuntu16.04系统上跑了,还是蛮欣慰的。 注&…

数据分析案例-印度美食数据可视化分析

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…

alphassl泛域名证书13个月600

AlphaSSL是GlobalSign旗下的数字证书品牌,它主要视为客户提供两种入门级的SSL证书——DV单域名以及泛域名SSL证书。这两种SSL证书一种可以保护www和两个域名记录,或者单个子域名激励;另一种可以同时保护多个域名记录,满足了大部分…

Django视图Views

Views视图 HttpRequest 和HttpResponse Django中的视图主要用来接受web请求,并做出响应。视图的本质就是一个Python中的函数视图的响应分为两大类 1)以Json数据形式返回(JsonResponse) 2)以网页的形式返回 2.1)重定向到另一个网页 (HttpRe…

计算机组成原理(超详解!!) 第九节 外围设备

1.外围设备概述 1.外围设备的一般功能 外围设备的定义:这个术语涉及到相当广泛的计算机部件。除了CPU和主存外,计算 机系统的每一部分都可作为一个外围设备来看待。 外围设备的功能:在计算机和其他机器之间,以及计算机与用户之…

C#知识|(实例)大乐透双色球随机选号器项目实现(一)

哈喽,你好啊,我是雷工! 本节学习练习大乐透双色球随机选号器项目的实现,以下为学习笔记。 01 功能需求 当点击【启动】按钮时,号码开始随机变化; 当点击【选择】按钮时,号码停止随机变化,并将选定的号码显示到下方列表; 当点击【清除】按钮时,下方显示列表被清空。…

C# 结合 JavaScript 对 Web 控件进行数据输入验证

目录 关于数据验证 范例运行环境 验证设计 JavaScript 方法 设计 实现 调用示例 C# 方法 设计 实现 调用示例 小结 关于数据验证 在 Web 应用的录入界面,数据验证是一项重要的实现功能,数据验证是指确认 Web 控件输入或选择的数据&#xff…

Microsoft Remote Desktop Beta v10.9.7 Mac微软远程连接工具

Microsoft Remote Desktop Beta 是一种软件应用程序,使用户能够从其设备远程访问基于 Windows 的计算机或虚拟机。它可以在 Windows 和 Mac 操作系统上下载。通过 Microsoft Remote Desktop,用户可以使用远程桌面协议 (RDP) 或 RemoteFX 协议连接到远程桌…

【qt】日历和定时器

日历和定时器 一.Calendar Widget(日历组件)1.日历的基本使用 二.定时器1.定时器的用处2.创建一个定时器3.设置定时器时间间隔4.设置定时器类型5.超时信号6.关联定时器7.启动定时器8.关闭定时器9.定时器要执行功能 三.总结一下: 一.Calendar Widget(日历组件) 1.日…

亚马逊调整退货处理费,卖家如何应对新挑战?

在电子商务领域,退货处理一直是一个重要且复杂的问题。作为全球最大的电子商务平台之一,亚马逊一直在寻求优化退货处理流程,以平衡消费者满意度和运营成本。近日,亚马逊宣布自2024年6月1日起,将对退货处理费收取标准进…

ATFNet:长时间序列预测的自适应时频集成网络

ATFNet是一个深度学习模型,它结合了时间域和频域模块来捕获时间序列数据中的依赖关系。引入了一种新的加权机制来调整周期性的权重,增强了离散傅立叶变换,并包括一个复杂关系识别的注意力机制,在长期时间序列预测中优于当前方法(每…

一休:一款专业的休息提醒软件

对于长期使用电子产品的人来说,保护眼睛至关重要,不论是工作还是学习,适当的休息都是必要的,保护视力要牢记20-20-20法则,眼科医生陶勇也科普过: 使用电脑工作和学习时,容易会忘记时间&#x…

Maven 依赖排查

先从项目去看显而易见,假如我们有一个项目,父工程中包含一些子工程,如下: 我们想看一下samples-account中的依赖关系,那么我们可以打开 samples-account的pom文件,查看其maven依赖关系图。 我们可以看到此项…

WPS如何把多个表格合并到一个表格里面?

注意:此功能需要wps会员。 例如:这里有3个表格。 现在希望合并3个表格到一起,如下图所示。 新建一个表格,打开表格。 选择 开始->工作表->合并表格->整合成为一个工作薄。 弹出对话框,选择添加文件&#xff…

JETBRAINS IDES 分享一个2099通用试用码,支持一键升级!DataGrip 2024 版

文章目录 废话不多说上教程:(动画教程 图文教程)一、动画教程激活 与 升级(至最新版本) 二、图文教程 (推荐)Stage 1.下载安装 toolbox-app(全家桶管理工具)Stage 2 : 下…

AndroidStudio集成高德地图后出现黑屏并报错

报错内容为:No implementation found for void com.autonavi.base.ae.gmap.GLMapEngine.nativeMainThreadTrigger(int, long) (tried Java_com_autonavi_base_ae_gmap_GLMapEngine_nativeMainThreadTrigger and Java_com_autonavi_base_ae_gmap_GLMapEngine_nativeM…

最佳解决Maven同一依赖多版本共存问题,重复依赖(同一个jar包,多个版本)-maven-shade-plugin

先看链接:原文链接 参照原文链接生成的文件(下面是我放的位置) mvn指令 mvn install:install-file -DfileD:\mavenrepository/maven-shade.jar -DgroupIdcom.wj -DartifactIdmaven-shade -Dversion1.1 -Dpackagingjar如果配置了maven_home 和java_home可以任意打开cmd执行(…

Linux-软件安装--tomcat的安装

tomcat的安装 1、下载tomcat安装包2.移动到自己想要解压的目录3、解压文件夹4、启动tomcat5、查看tomcat进程6、查看日志7、通过浏览器访问成功8、停止tomecat服务8.1运行tomcat的bin目录中提供的停止服务的脚本文件shutdcwn.sh8.2结束tomcat进程1、下载tomcat安装包 本篇文章…