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

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

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

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

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

关于面试题

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

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

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

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

面试题答案

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

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

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

逃逸分析的概念

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

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

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

对象逃逸示例

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

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

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

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

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

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

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

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

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

逃逸分析的优点

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

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

对象可能分配在栈上

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

分离对象或标量替换

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

同步锁消除

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

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

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

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

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

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

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

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

标签:
  • 热门焦点
  • 6月安卓手机好评榜:魅族20 Pro蝉联冠军

    性能榜和性价比榜之后,我们来看最后的安卓手机好评榜,数据来源安兔兔评测,收集时间2023年6月1日至6月30日,仅限国内市场。第一名:魅族20 Pro好评率:95%5月份的时候魅族20 Pro就是
  • 企业采用CRM系统的11个好处

    客户关系管理(CRM)软件可以为企业提供很多的好处,从客户保留到提高生产力。  CRM软件用于企业收集客户互动,以改善客户体验和满意度。  CRM软件市场规模如今超过580
  • 之家push系统迭代之路

    前言在这个信息爆炸的互联网时代,能够及时准确获取信息是当今社会要解决的关键问题之一。随着之家用户体量和内容规模的不断增大,传统的靠"主动拉"获取信息的方式已不能满足用
  • 华为发布HarmonyOS 4:更好玩、更流畅、更安全

    在8月4日的华为开发者大会2023(HDC.Together)大会上,HarmonyOS 4正式发布。自2019年发布以来,HarmonyOS一直以用户为中心,经历四年多的发展HarmonyOS已
  • 华为HarmonyOS 4升级计划公布:首批34款机型今日开启公测

    8月4日消息,今天下午华为正式发布了HarmonyOS 4系统,在更流畅的前提下,还带来了不少新功能,UI设计也有变化,会让手机焕然一新。华为宣布,首批机型将会在
  • 2纳米决战2025

    集微网报道 从三强争霸到四雄逐鹿,2nm的厮杀声已然隐约传来。无论是老牌劲旅台积电、三星,还是誓言重回先进制程领先地位的英特尔,甚至初成立不久的新
  • 三星推出Galaxy Tab S9系列平板电脑以及Galaxy Watch6系列智能手表

    2023年7月26日,三星电子正式发布了Galaxy Z Flip5与Galaxy Z Fold5。除此之外,Galaxy Tab S9系列平板电脑以及三星Galaxy Watch6系列智能手表也同期
  • iQOO Neo8系列今日官宣:首发天玑9200+ 全球安卓最强芯!

    在昨日举行的的联发科新一代旗舰芯片天玑9200+的发布会上,iQOO官方也正式宣布,全新的iQOO Neo8系列新品将全球首发搭载这款当前性能最强大的移动平台
  • 2022爆款:ROG魔霸6 冰川散热系统持续护航

    喜逢开学季,各大商家开始推出自己的新产品,进行打折促销活动。对于忠实的端游爱好者来说,能够拥有一款梦寐以求的笔记本电脑是一件十分开心的事。但是现在的
Top