当前位置:首页 > 科技  > 软件

最近一周,十人面试,十人全挂在这个问题上!

来源: 责编: 时间:2024-05-16 09:09:44 260观看
导读从开始学习Java的时候,我们就接触了这样一种观点:Java中的对象是在堆上创建的,对象的引用是放在栈里的,这个观点真的是正确的吗?关于面试题面试题:Java中的对象是在堆上分配的吗?有些小伙伴心里会想:我从一开始学习Java时,就知

58j28资讯网——每日最新资讯28at.com

从开始学习Java的时候,我们就接触了这样一种观点:Java中的对象是在堆上创建的,对象的引用是放在栈里的,这个观点真的是正确的吗?58j28资讯网——每日最新资讯28at.com

关于面试题

面试题:Java中的对象是在堆上分配的吗?58j28资讯网——每日最新资讯28at.com

有些小伙伴心里会想:我从一开始学习Java时,就知道了:Java中的对象是在堆上创建的,对象的引用是存储到栈中的,那Java中的对象是在堆上分配的啊!难道不是吗?58j28资讯网——每日最新资讯28at.com

如果你这样回答,就会被直接Pass掉。58j28资讯网——每日最新资讯28at.com

或许有些小伙伴还是不太明白,那我们继续往下看。58j28资讯网——每日最新资讯28at.com

面试题答案

首先,我们先给出这个题目的答案,这里我先简短的回答下这个面试题,后续我们会进行相关分析。58j28资讯网——每日最新资讯28at.com

你可以这样回答:Java中的对象不一定是在堆上分配的,因为JVM通过逃逸分析,能够分析出一个新对象的使用范围,并以此确定是否要将这个对象分配到堆上。58j28资讯网——每日最新资讯28at.com

这里,我们接触了一个新名词:逃逸分析。相信很多小伙伴不是很明白,那我们继续往下看。58j28资讯网——每日最新资讯28at.com

逃逸分析的概念

先以官方的形式来说下什么是逃逸分析。逃逸分析就是:一种确定指针动态范围的静态分析,它可以分析在程序的哪些地方可以访问到指针。58j28资讯网——每日最新资讯28at.com

在JVM的即时编译语境下,逃逸分析将判断新建的对象是否逃逸。即时编译判断对象是否逃逸的依据:一种是对象是否被存入堆中(静态字段或者堆中对象的实例字段),另一种就是对象是否被传入未知代码。58j28资讯网——每日最新资讯28at.com

直接说这些概念,确实有点晕啊,那我们就来两个示例。58j28资讯网——每日最新资讯28at.com

对象逃逸示例

一种典型的对象逃逸就是:对象被复制给成员变量或者静态变量,可能被外部使用,此时变量就发生了逃逸。58j28资讯网——每日最新资讯28at.com

我们可以用下面的代码来表示这个现象。58j28资讯网——每日最新资讯28at.com

/** * @author binghe * @description 对象逃逸示例1 */public class ObjectEscape{    private User user;    public void init(){        user = new User();    }}

在ObjectEscape类中,存在一个成员变量user,我们在init()方法中,创建了一个User类的对象,并将其赋值给成员变量user。此时,对象被复制给了成员变量,可能被外部使用,此时的变量就发生了逃逸。58j28资讯网——每日最新资讯28at.com

另一种典型的场景就是:对象通过return语句返回。如果对象通过return语句返回了,此时的程序并不能确定这个对象后续会不会被使用,外部的线程可以访问到这个变量,此时对象也发生了逃逸。58j28资讯网——每日最新资讯28at.com

我们可以用下面的代码来表示这个现象。58j28资讯网——每日最新资讯28at.com

/** * @author binghe * @description 对象逃逸示例2 */public class ObjectReturn{    public User createUser(){        User user = new User();        return user;    }}

给出两个示例,相信小伙伴们对JVM的逃逸分析多少有点了解了吧,没错,JVM通过逃逸分析,能够分析出新对象的使用范围,从而决定新对象是否要在堆上进行分配。58j28资讯网——每日最新资讯28at.com

还没完,我们继续看下逃逸分析的优点,以便于小伙伴们能够更好的理解逃逸分析。58j28资讯网——每日最新资讯28at.com

逃逸分析的优点

逃逸分析的优点总体上来说可以分为三个:对象可能分配在栈上、分离对象或标量替换、消除同步锁。我们可以使用下图来表示。58j28资讯网——每日最新资讯28at.com

图片58j28资讯网——每日最新资讯28at.com

对象可能分配在栈上

JVM通过逃逸分析,分析出新对象的使用范围,就可能将对象在栈上进行分配。栈分配可以快速地在栈帧上创建和销毁对象,不用再将对象分配到堆空间,可以有效地减少 JVM 垃圾回收的压力。58j28资讯网——每日最新资讯28at.com

分离对象或标量替换

当JVM通过逃逸分析,确定要将对象分配到栈上时,即时编译可以将对象打散,将对象替换为一个个很小的局部变量,我们将这个打散的过程叫做标量替换。将对象替换为一个个局部变量后,就可以非常方便的在栈上进行分配了。58j28资讯网——每日最新资讯28at.com

同步锁消除

如果JVM通过逃逸分析,发现一个对象只能从一个线程被访问到,则访问这个对象时,可以不加同步锁。如果程序中使用了synchronized锁,则JVM会将synchronized锁消除。58j28资讯网——每日最新资讯28at.com

这里,需要注意的是:这种情况针对的是synchronized锁,而对于Lock锁,则JVM并不能消除。58j28资讯网——每日最新资讯28at.com

要开启同步消除,需要加上 -XX:+EliminateLocks 参数。因为这个参数依赖逃逸分析,所以同时要打开 -XX:+DoEscapeAnalysis 选项。58j28资讯网——每日最新资讯28at.com

所以,并不是所有的对象和数组,都是在堆上进行分配的,由于即时编译的存在,如果JVM发现某些对象没有逃逸出方法,就很有可能被优化成在栈上分配。58j28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-88381-0.html最近一周,十人面试,十人全挂在这个问题上!

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: SpringBoot3.x 和 WebSocket 在物联网设备管理中的应用

下一篇: 聊聊Vue.js 基础语法详解

标签:
  • 热门焦点
  • 6月iOS设备好评榜:第一蝉联榜首近一年

    作为安兔兔各种榜单里变化最小的那个,2023年6月的iOS好评榜和上个月相比没有任何排名上的变化,仅仅是部分设备好评率的下降,长年累月的用户评价和逐渐退出市场的老款机器让这
  • Rust中的高吞吐量流处理

    作者 | Noz编译 | 王瑞平本篇文章主要介绍了Rust中流处理的概念、方法和优化。作者不仅介绍了流处理的基本概念以及Rust中常用的流处理库,还使用这些库实现了一个流处理程序
  • 微软邀请 Microsoft 365 商业用户,测试视频编辑器 Clipchamp

    8 月 1 日消息,微软近日宣布即将面向 Microsoft 365 商业用户,开放 Clipchamp 应用,邀请用户通过该应用来编辑视频。微软于 2021 年收购 Clipchamp,随后开始逐步整合到 Microsof
  • 雅柏威士忌多款单品价格大跌,泥煤顶流也不香了?

    来源 | 烈酒商业观察编 | 肖海林今年以来,威士忌市场开始出现了降温迹象,越来越多不断暴涨的网红威士忌也开始悄然回归市场理性。近日,LVMH集团旗下苏格兰威士忌品牌雅柏(Ardbeg
  • “又被陈思诚骗了”

    作者|张思齐 出品|众面(ID:ZhongMian_ZM)如今的国产悬疑电影,成了陈思诚的天下。最近大爆电影《消失的她》票房突破30亿断层夺魁暑期档,陈思诚再度风头无两。你可以说陈思诚的
  • 猿辅导与新东方的两种“归途”

    作者|卓心月 出品|零态LT(ID:LingTai_LT)如何成为一家伟大企业?答案一定是对“势”的把握,这其中最关键的当属对企业战略的制定,且能够站在未来看现在,即使这其中的
  • 华为和江淮汽车合作开发百万元问界MPV?双方回应来了

    8月1日消息,郭明錤今天在社交平台发文称,华为正在和江淮汽车合作,开发售价在100万元的问界MPV,预计在2024年第2季度量产,销量目标为上市首年交付5万辆。
  • DRAM存储器10月价格下跌,NAND闪存本月价格与上月持平

    10月30日,据韩国媒体消息,自今年年初以来一直在上涨的 DRAM 存储器的交易价格仅在本月就下跌了近 10%,此次是全年首次降价,而NAND 闪存本月价格与上月持平。市
  • SN570 NVMe SSD固态硬盘 价格与性能兼具

    SN570 NVMe SSD固态硬盘是西部数据发布的最新一代WD Blue系列的固态硬盘,不仅闪存技术更为精进,性能也得到了进一步的跃升。WD Blue SN570 NVMe SSD的包装外
Top