Java中对象都存放在堆中吗?你知道逃逸分析?

面试官:Java虚拟机的内存分为哪几个区域?

我(微笑着):程序计数器、虚拟机栈、本地方法栈、堆、方法区

面试官:对象一般存放在哪个区域?

我:堆。

面试官:对象都存放在堆中吗?

我:是的。

面试官:你了解过逃逸分析吗?

我(皱了皱眉):是内存溢出吗?

面试官:不是的。

我(挠了挠头):不是很了解。

面试官:今天的面试先到这,回去等消息吧!

然后就没有然后了,不甘心的我开始了查找相关资料。

逃逸分析

逃逸分析(Escape Analysis)是一种确定对象的引用动态范围的分析方法,说人话就是:分析在程序的哪些地方可以访问到对象的引用。

当一个对象在方法中被分配时,该对象的引用可能逃逸到其它执行线程中,或是返回到方法的调用者。

如果一个方法中分配一个对象并返回一个该对象的引用针,那么该对象可能被访问到的地方就无法确定,此时对象的引用就发生了“逃逸”。

如果对象的引用存储在静态变量或者其它数据结构中,因为静态变量是可以在当前方法之外访问到,此时对象的引用也发生了“逃逸”。

逃逸分析确定某个对象的引用可以被访问的所有地方,以及确定能否保证对象的引用的生命周期只在当前进程或线程中。

逃逸状态

对象的逃逸状态一般分为三种:全局逃逸、参数逃逸、没有逃逸。

全局逃逸(GlobalEscape)

对象的引用逃出了方法或者线程。比如:对象的引用赋值给了一个静态变量,或者存储在一个已经逃逸的对象中, 或者对象的引用作为方法的返回值给了调用方法。

比如饿汉的单例模式:

package one.more;

public final class GlobalEscape {

    // instance对象赋值给了一个静态变量,发生了全局逃逸
    private static GlobalEscape instance = new GlobalEscape();

    private GlobalEscape() {
    }

    public static GlobalEscape getInstance() {
        return instance;
    }
}

参数逃逸(ArgEscape)

对象被作为方法参数传递或者被参数引用,但在调用过程中不会发生全局逃逸。这个状态是通过分析被调用方法的字节码来确定的。

比如:

package one.more;

public class ArgEscape {

    class Rectangle {

        private int length;
        private int width;

        public Rectangle(int length, int width) {
            this.length = length;
            this.width = width;
        }

        public int getArea() {
            return this.length * this.width;
        }
    }

    public int getArea(int length, int width) {
        Rectangle rectangle = buildRectangle(length, width);
        return rectangle.getArea();
    }

    private Rectangle buildRectangle(int length, int width){
        Rectangle rectangle = new Rectangle(length, width);
        // rectangle对象发生了参数逃逸
        return rectangle;
    }
}

没有逃逸(NoEscape)

方法中的对象没有发生逃逸,这意味着可以不将该对象分配在堆上。

比如:

package one.more;

public class NoEscape {

    class Rectangle {

        private int length;
        private int width;

        public Rectangle(int length, int width) {
            this.length = length;
            this.width = width;
        }

        public int getArea() {
            return this.length * this.width;
        }
    }

    public int getArea(int length, int width) {
        // rectangle对象没有逃逸
        Rectangle rectangle = new Rectangle(length, width);
        return rectangle.getArea();
    }
}

逃逸分析后的优化

如果一个对象没有发生逃逸,或者只有参数逃逸,就可能为这个对象采取不同程度的优化,比如:栈上分配、标量替换、同步消除。

栈上分配(Stack Allocations)

如果一个对象不会逃逸出线程之外,那让这个对象在栈上分配内存将会是一个很不错的主意,对象所占用的内存空间就可以随栈帧出栈而销毁。

那么,对象就会随着方法的结束而自动销毁了,可以降低垃圾收集器运行的频率,垃圾收集的压力就会下降很多。

标量替换(Scalar Replacement)

标量(Scalar)是指一个无法再分解成更小的数据的数据。Java虚拟机中的基本数据类型(int、long等数值类型及reference类型等)都不能再进一步分解了,那么这些数据就可以被称为标量。相对的,如果一个数据可以继续分解,那它就被称为聚合量(Aggregate),Java中的对象就是典型的聚合量。

如果把一个Java对象拆散,根据程序访问的情况,将其用到的成员变量恢复为基本类型来访问,这个过程就称为 标量替换 。

如果一个对象没有发生逃逸,可以进行标量替换,那么对象的成员变量就在栈上分配和读写,不需要分配到堆中。

标量替换可以视作栈上分配的一种特例,实现更简单,但对逃逸程度的要求更高,它不允许对象没有发生逃逸。

同步消除(Synchronization Elimination)

线程同步本身是一个相对耗时的过程,如果一个对象没有逃逸出线程,无法被其他线程访问,那么该对象的读写肯定就不会有竞争,对该对象实施的同步加锁操作也就可以安全地消除掉。

总结

说了这么多,可以发现对象并不是都在堆上分配内存的。因为通过逃逸分析后,可以对没有逃逸的对象进行标量替换。

另外,由于复杂度等原因,HotSpot中目前还不支持栈上分配的优化。

本文链接:https://www.dzdvip.com/30197.html 版权声明:本文内容均来源于互联网。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 395045033@qq.com,一经查实,本站将立刻删除。
(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022年3月14日 16:19
下一篇 2022年3月14日 16:21

相关推荐

  • 2021什么样的产品更适合跨境电商?

    后疫情时代,电商消费已经逐渐趋于常态化,购物习惯已达到平衡。然而在新形势下,电商卖家要如何重新设定自己的Listing,优化选品——已然成为了所有卖家不得不思考的问题。 尤其对于跨境电商卖家,在疫情的影响下众多传统卖家纷纷加入跨境平台,使得本来就已趋近饱和的类目又迎来一大批竞争对手,当下苦不堪言,选品优化已经势在必行! 如何能在新的时期选出利基产品,突破对手的围堵,开创新的产品格局? 做客户喜欢的产品 什么样的产品适合跨境电商平台销售,答案当然是客户喜欢的产品。电商卖家应当学会在数据中看出用户的偏好,你要针对的是哪一个客户群?这个群体喜欢什么?有针对性地制定产品布局才能让你的Listing看起来更加吸引人。 曾经有很多卖家由于“不倾听客户的意见”而经历一次又一次的选品失败。所谓的数字营销就是与客户之间的一次次对话,了解用户需要,满足用户需求,这是营销最基本的步骤。 挖掘数据,找到蓝海 跨境卖家首先应该确定你要做的产品是不是当下市场群体所需要的,尤其是一款小众新品,在投资之前一定要三思而后行。可以通过研究亚马逊或阿里巴巴等电子商务巨头关于该产品的披露信息,看数据不能只看表面,卖家要学会分析数据。 如果通过搜索发现这款产品极为火爆,那就要考虑它是否已经出现山寨产品,是否已经开始打价格战;如果发现这款产品几乎没人售卖,这时也不要灰心,可以通过社交平台搜索相关话题,如果人们都在讨论这方面的内容,但电商平台却没人售卖,那恭喜你,这是一个非常宝贵的蓝海市场。 低客单价的优势 10-40 美元这个价格范围被广泛接受为网上购物者的“甜蜜点”,非常适合冲动购买和知情交易,与之相对的,价格高于 50 美元的产品会促使潜在客户到别处购买。 跨境卖家如果你的商品价格高于 10-40 美元,请确保它是在价格上优惠的。有竞争力的价格可以击败大部分竞争者,但也要注意1-10 美元范围内的商品通常不值得运费,因此消费者会在实体店内购买这些商品。 新品更能吸引眼球 如果Listing不能让客户兴奋,那么其他任何进一步的电子商务营销策略都将是徒劳的!而新产品本身的特性就是能给客户带来好奇心。运用上面提到筛选数据的方法,找到客户关注的新型产品,并提供足够的种类让自己与众不同。 如果能做好这些步骤,那么客户就会乐于浏览店内产品,下单甚至重复下单,因为你所销售的都是最新且最符合他口味的产品。只有真正了解客户…

    2021年6月10日
    2
  • 如何让网站关键词排名长期保持稳定的?

    相信这一点大家都很清楚,而且不少人尝过服务器不稳定的后果了,后果相当严重,如果连续几次出现网站无法访问,那么,度娘就会降低你网站的信任度,那就有可能将你从你原人的位置移走。

    2021年5月9日
    0
  • 蓝牙耳机哪家的音质最好?推荐几款音质好的蓝牙耳机

    蓝牙耳机已经全面普及,这也得益于3.5mm接口的取消。早前蓝牙耳机面对的例如续航、连接稳定性、音质、智能化等诸多困难需要突破解决,随着TWS技术的进一步成熟,这些困难已经逐一解决了。在这里就分享几款音质出众的无线蓝牙耳机! 第一款:Xisem西圣Ava 推荐理由:声音饱满,信号稳定 Xisem西圣蓝牙耳机这两年凭借着超高性价比逆天的配置火爆了整个数码圈,据说是音质性价比第一的品牌,在音频解析技术上有十多年的技术经验,被称为百元蓝牙耳机中的战斗机,销量十分火爆,深受数码圈,学生党的青睐! xisem西圣Ava的13mm大动圈带来醇厚低音享受,有很好的沉浸感,人声饱满紧实,高频开阔、震撼;三腔体设计犹如身临其境般。整体的音质表现,我认为是可以媲美300-500左右的蓝牙耳机!还有蓝牙5.2芯片的加持,信号更稳定! 第二款:索尼WF-H800 推荐理由:音质均衡,专业调音 索尼WF-H800采用了符合人体工程学的三点支撑结构,使人戴上后感到非常稳定。音质上,使用了索尼特有的数字音频增强引擎技术,可以将mp3音源转换为高音质的等效音频,获得非常清晰的音响效果。声音定位准确,使男女声听起来均迷人而舒适。编解码器支持SBC和AAC,支持左右耳同时传输以及佩戴状态检测。 第三款:三星Galaxy Buds Pro 推荐理由:主动降噪,佩戴舒适 Galaxy Buds Pro除了颜值高,佩戴起来也很舒适,它的通气口可以平衡耳内压力,增加空气流动。耳机内部设计有3个麦克风和1个语音拾取单元。这些硬件设备让Galaxy Buds Pro耳机具有了很强的降噪功能以及语音检测功能。ANC智能主动降噪,支持强度2档可调,最高可滤过99%的背景噪音。 第四款:捷波朗Elite Active 65t 推荐理由:音质高清,运动适用 Active 65t是捷波朗出品的大热门爆款明星产品,在国外的知名度不次于Airpods,Active 65t在科技的配备上是非常强大的,蓝牙5.0版本6级防水性能,而且独特的侧听功能与智能运动监测功能的搭载,也都让这款真无线耳机,可以给我们带来不同以往的体验。独特的4麦克风技术更是被巧妙地加载于耳机外壳的末梢延伸处通话清晰度再提一个度。 第五款:森海塞尔True Wireless 推荐理由:高清解码,低音浑厚 森海塞尔True Wireless采用了小巧紧凑的入耳式设…

    2021年6月21日
    0
  • SEO中的5种链接,SEO怎么做友情链接最佳

    许多站长比较热衷于交换友情链接,优质友情链接不但能给网站传递权重(PR),引蜘蛛、带动收录,而且可以带来一些定向流量! 但是怎样换到或许找到需求的友情链接 ,就不是那么简单的事情了!可能有网站本身的原因,交换后反而你的网站不如从前了。 下面牛站分类目录网 带着各位站长慢慢往下看,牛站希望和大家一起学习进步。     下面就来讲讲SEO中常见的五种链接! 一、内链 内链实际上是在每一个网页之间的链接,但站在最佳角度,使内链的价值最大化,将精心挑选的网页,也就是说你决定哪一种页面之间的联系对方。内链锚文本通常是关键词,例如,我想建立一个锚文本搜索引擎优化的链,然后你就会知道哪些网页内链链上的排名有较大的帮助。     二、外链 对于SEO来说,外链是一个被关注次数最高的词,外链从搜索引擎的角度,它希望是一个自然链接,并且具有高度的推荐价值,因此它并不是一个文章内容页的特定目标关键词的锚文本。理论上应该是,目标页面内容高度相关的锚文本链接,它对该页内容,具有进一步详解阐述的作用,并能够支持访客,更好的理解目标页内容。 三、友链 当两个网站所有者以超文本链接的方式参与链接到彼此的网站时,这两者都通过相互链接而受益,这种链接方式被称为友情链接。友情链接通常是两个网站或两个非联合网站之间的互链关系,目的是推动业务或任何其他目标。 四、反链 反链,即指反向链接。在SEO优化过程中,它是相对于两个网页来讲的,打个比方,对于网页D来讲,如果某个网页C给网页D做了链接,无论是同一个站还是不同的站,网页C上的这个链接,对于网页D来讲,它都是反链。 五、死链 死链是每个站长在优化网站中都会遇到的问题,网站中存在大量的死链对搜索引擎来说是不友好的,把蜘蛛绕进一个死胡同,会影响网站的质量度。从用户的角度来讲,打开链接是个不存在的错误页面(返回状态码为404的页面),基本上都会关掉,不仅影响用户的体验度,还会直接性的损失用户。死链对网站而言会造成跳出率的增加、收录骤减、排名下降和降权等危害。因此,定期检测网站死链是非常必要的。     对企业来讲,一般友情链接都是交给专业人士处理的。那么,如果想要判断友情链接好不好,可以通过哪些维度进行评判呢? 1. 数量 友情链接不是越多越好。友情链接最好的情况是,与我们交换链接的网站有很高的质量。比如权重高。即使有这方面的资源,有很多权重高相关度高的网站愿意…

    2021年8月18日
    9
  • 提升SEO效果的6个建站技巧

    现在很多新手建设网站时,不知道该怎么把网站建设得更吸引人,怎么让网站在搜索引擎中获得更多展示。其实这是有特定方法的,新手可以从下面这几点入手,运用这些技巧来提高网站收录和排名效果: 1.首页简单整洁搜索引擎不会喜欢首页杂乱无章的网站。因此,在制作网站时,你的首页一定要简单明了,头图banner清晰、美观,一两句话说明网站主题即可,接下来则可以使用横向布局、纵向布局、定价表、自定义表单、相册、网格、大尺寸媒体等版块,有条理地向客户展示内容。 上线了建站案例,禁止转载 整体站点的结构要清晰,各版块内容要有清晰的层级逻辑,主页-目录-次级目录-内容详细页,形成一个树状结构。这些结构「上线了」建站系统会自动反应在URL的结构上,也有利于提高你网站的排名。 2.交换友链 新站想先让搜索引擎认识,就需要做一些外链的交换,这样才利于被发现,也可以使用主动提交到百度站长平台,增加被识别机会。 3.根据搜索词更新内容 找一些行业内比较受欢迎的搜索词,根据这些搜索词来创造内容,以提升网站在这一特定领域的搜索展现效果,举个例子,你要做一个本地生活服务网站,那么就可以用“地名 服务类型”的搜索词,比如“上海垃圾分类”、“XX废旧物品回收”等,围绕这些信息做内容,出头的机会比较大。 你也可以从站长工具、5118等网站上搜索提取自己行业的关键词,并根据这些词来展开内容。 上线了建站案例,禁止转载 4.高质量的原创内容 内容质量是搜索排序的重要原则之一,它代表着资源本身所传递的价值高低,非常影响网站的搜索权重。因此建站者一定要重视网站的原创内容,并且要持续优化,保持稳定更新,文字流畅,有理有据。 5.时效性指的是资源的发布时间和内容的新旧程度,一般越新的内容排名会越靠前,所以你的网站要持续更新。有条件的话可以请一些影响力大的、行业权威人士来为你撰稿,增加网站的可信度。 6.浏览体验 用户的浏览体验、浏览反馈,也会很明显地影响网站排名效果。左图页面挂件多,正文被部分遮挡,造成阅读障碍,易引起误点击;右图正文无广告无挂件,浏览体验好,会更得搜索引擎喜欢。 图片来源:5118 在建站时,尤其要避开这些问题:文不对题、恶意拼凑、广告干扰、误导欺骗、功能失效等,都会严重降低用户浏览体验。若想提高排名,就千万不要犯这些错误,而要多用上面的6个建站技巧,才能让网站越来越好。

    2021年6月16日
    1
  • 为什么安卓越用越卡?背后原因是什么?

    “我手机刚买一年,怎么越来越卡?”不知道屏幕前的你看到这句话怎么想,不过我身边确实有很多朋友跟我抱怨过这件事,其中大部分用户都是安卓,这到底是为什么呢? 其实这也不能完全怪手机,有很大一部分原因是用户行为所致,今天我就来教大家一招,保你手机跟我一样越用越流畅。 要想解决安卓手机卡顿的问题,你得先了解其底层机制是什么,为了防止大家懵,我尽量说的简单一些。 1、渲染机制问题 ,苹果的UI渲染是实时的;而安卓的UI渲染则是传统PC模式的主线程普通优先级,所以导致在用户使用上会感觉到iPhone更加流畅。 2、GPU加速问题 ,苹果对于各种特效处理基本都是基于GPU硬件加速进行的,并不会借助CPU或者程序自身,这样能够带来更快的速度;安卓则是需要适应不同产品型号与硬件,所以就导致很多的图形特效需要靠程序本身加速。 3、后台机制问题 ,这个问题相信不少朋友都懂,真伪后台的问题。苹果在大量APP并存的后台其实是一个伪后台,并不会占用手机内存,所以也就并不会存在什么卡顿问题。 4、垃圾产生问题 ,其实说“垃圾”并不是很准确,更加精确的说法是手机在使用过程中产生的缓存,这个东西没办法避免。 由于Java虚拟机的存在,安卓手机的二次转化效率是很低的,随着APP的增多,会加剧手机的老化,也就会更“卡”。 简单来说其实也就这么多了,那既然我们了解了安卓卡顿的原因之后再去找解决办法是不是轻松了很多呢?没错,接下来我就来跟大家分享几个我的用机习惯,保证让你手机越用越流畅。 五大技巧让你远离安卓卡顿 垃圾/缓存清理很重要,释放空间少不了 安卓手机的功能创新性和实用性是苹果手机所不具备的,但是这背后所带来的影响就是,我们常用的APP越来越大、越来越臃肿,越来越多的APP在启动时要同步激活各种功能的线程和子进程。 一、APP臃肿,缓存不删除 可能你刚刚下载一款APP的时候仅有几百MB或者1GB,但是随着时间流逝你会发现,哎?这款APP怎么多了好几个GB? 这些久久不清理的垃圾会越积越多,但是你也别着急,只要按时清理是不会有太大问题的。 只要是在明面上可以操作的事情,那都不是事情。以微信为例,我们可以在【设置】-【通用】-【存储空间】中进行清理。 此外,关闭“拍摄或者编辑后的内容保存到相册”也是很有必要的,可以在【照片、视频、文件和通话】中进行关闭,此举也可以避免缓存过多导致系统内存不够用进而影响手…

    2021年6月15日
    0

发表评论

您的电子邮箱地址不会被公开。