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

微博二面:所有对象都一定被分配在堆中么?

来源: 责编: 时间:2023-10-27 09:14:45 379观看
导读什么是逃逸分析所谓逃逸,包括方法逃逸和线程逃逸,线程逃逸的逃逸程度高于方法逃逸(线程逃逸 > 方法逃逸):当一个对象在方法里面被定义后,它如果被外部方法所引用(例如作为调用参数传递到其他方法中),这种称为方法逃逸;可能被外

什么是逃逸分析

所谓逃逸,包括方法逃逸和线程逃逸,线程逃逸的逃逸程度高于方法逃逸(线程逃逸 > 方法逃逸):6rv28资讯网——每日最新资讯28at.com

当一个对象在方法里面被定义后,它如果被外部方法所引用(例如作为调用参数传递到其他方法中),这种称为方法逃逸;6rv28资讯网——每日最新资讯28at.com

可能被外部其他线程访问到,譬如赋值给可以在其他线程中访问的实例变量,这种称为线程逃逸;6rv28资讯网——每日最新资讯28at.com

this 引用逃逸就是一种线程逃逸:在构造器构造还未彻底完成前(即实例初始化阶段还未完成),将自身 this 引用向外抛出并被其他线程复制(访问)了该引用,那么其他线程就可能会访问到该还未被初始化的变量。6rv28资讯网——每日最新资讯28at.com

举个例子:6rv28资讯网——每日最新资讯28at.com

public class FinalReferenceEscapeTest {     final int i;     static FinalReferenceEscapeTest obj;     public FinalReferenceEscapeTest () {          i = 1;                   // 1. 写 final 域  obj = this;              // 2. this 引用在此 "逸出" } // 线程 A public static void writer() {   new FinalReferenceEscapeExample();  } // 线程  B public static void reader() {   if (obj != null) {      // 3    int temp = obj.i;   // 4   }  }}

假设一个线程 A 执行 writer() 方法,另一个线程 B 执行 reader() 方法。这里的操作 2 将自身 this 引用向外抛出,使得 FinalReferenceEscapeTest 对象还未完成构造前就为其他线程可见。6rv28资讯网——每日最新资讯28at.com

有的同学可能会问,这个操作 2 不是在构造函数的最后一步吗,它执行完构造函数也执行完了,对象不就已经完成构造了吗?6rv28资讯网——每日最新资讯28at.com

But 这里的操作 1 和操作 2 之间可能被重排序。如下图所示,线程 B 不能正确地读到 i = 1,而是未初始化的 i = 0:6rv28资讯网——每日最新资讯28at.com

所以,我们可以得出这样的结论:在构造函数返回前,被构造对象的引用不能为其他线程所见,因为此时的各个字段(域)可能还没有被初始化。6rv28资讯网——每日最新资讯28at.com

如果虚拟机能够确定一个对象不会发生方法逃逸和线程逃逸,或者逃逸程度比较低(只发生方法逃逸,不发生线程逃逸),则(JIT 即时编译器)可以为这个对象实例采取不同程度的优化,比如锁消除 Lock Elimination(也称为 “同步消除 Synchronization Elimination”)、还有 栈上分配(Stack Allocations) 和 标量替换(Scalar Replacement)等6rv28资讯网——每日最新资讯28at.com

栈上分配

栈上分配(Stack Allocations)是 JIT 即时编译器的一项优化技术:如果确定一个对象不会逃逸出线程之外(不发生逃逸或逃逸程度较低 - 方法逃逸),那让这个对象在栈(线程私有)上分配内存将会是一个很不错的主意,对象所占用的内存空间就可以随栈帧出栈而销毁。6rv28资讯网——每日最新资讯28at.com

在一般应用中,完全不会逃逸的局部对象和不会逃逸出线程的对象所占的比例是很大的,如果能使用栈上分配,那大量的对象就会随着方法的结束而自动销毁了,垃圾收集子系统的压力将会下降很多6rv28资讯网——每日最新资讯28at.com

示例代码:6rv28资讯网——每日最新资讯28at.com

public class StackAllocationExample {    private static final int MAX = 10000000;        public static void main(String[] args) {        long start = System.currentTimeMillis();        for (int i = 0; i < MAX; i++) {            allocateOnStack();        }        long end = System.currentTimeMillis();        System.out.println("Time taken: " + (end - start) + "ms");    }        private static void allocateOnStack() {        Point p = new Point();        p.x = 1;        p.y = 2;    }        private static class Point {        int x;        int y;    }}

在这个示例代码中,我们定义了一个私有的静态内部类 Point,它包含两个 int 类型的成员变量 x 和 y。在 main 方法中,我们循环调用 allocateOnStack 方法,该方法内部创建一个 Point 对象并将其成员变量赋值为 1 和 2。由于 allocateOnStack 方法没有返回 Point 对象,换言之 Point 对象是不会被暴露给其他线程的,即不会发生线程逃逸,因此编译器可以将该对象分配在栈上而不是堆上。6rv28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-15315-0.html微博二面:所有对象都一定被分配在堆中么?

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

上一篇: DFA算法,高效实现敏感词检测与替换!

下一篇: Python字典全解析:从基础到高级应用

标签:
  • 热门焦点
  • K60 Pro官方停产 第三方瞬间涨价

    虽然没有官方宣布,但Redmi的一些高管也已经透露了,Redmi K60 Pro已经停产且不会补货,这一切都是为了即将到来的K60 Ultra铺路,属于厂家的正常操作。但有意思的是该机在停产之后
  • 7月安卓手机好评榜:三星S23Ultra好评率第一

    性能榜和性价比榜之后,我们来看最后的安卓手机好评榜,数据来源安兔兔评测,收集时间2023年7月1日至7月31日,仅限国内市场。第一名:三星Galaxy S23 Ultra好评率:95.71%在即将迎来新
  • 6月iOS设备好评榜:第一蝉联榜首近一年

    作为安兔兔各种榜单里变化最小的那个,2023年6月的iOS好评榜和上个月相比没有任何排名上的变化,仅仅是部分设备好评率的下降,长年累月的用户评价和逐渐退出市场的老款机器让这
  • 消息称迪士尼要拍真人版《魔发奇缘》:女主可能也找黑人演员

    8月5日消息,迪士尼确实有点忙,忙着将不少动画改成真人版,继《美人鱼》后,真人版《白雪公主》、《魔发奇缘》也在路上了。据外媒消息称,迪士尼将打造真人版
  • 多线程开发带来的问题与解决方法

    使用多线程主要会带来以下几个问题:(一)线程安全问题  线程安全问题指的是在某一线程从开始访问到结束访问某一数据期间,该数据被其他的线程所修改,那么对于当前线程而言,该线程
  • 使用LLM插件从命令行访问Llama 2

    最近的一个大新闻是Meta AI推出了新的开源授权的大型语言模型Llama 2。这是一项非常重要的进展:Llama 2可免费用于研究和商业用途。(几小时前,swyy发现它已从LLaMA 2更名为Lla
  • 微博大门常打开,迎接海外画师漂洋东渡

    作者:互联网那些事&ldquo;起猛了,我能看得懂日语了&rdquo;。&ldquo;为什么日本人说话我能听懂?&rdquo;&ldquo;中文不像中文,日语不像日语,但是我竟然看懂了&rdquo;&hellip;&hell
  • 华为Mate60标准版细节曝光:经典星环相机模组回归

    这段时间以来,关于华为新旗舰的爆料日渐密集。据此前多方爆料,今年华为将开始恢复一年双旗舰战略,除上半年推出的P60系列外,往年下半年的Mate系列也将
  • 自研Exynos回归!三星Galaxy S24系列将提供Exynos和骁龙双版本

    年初,全新的三星Galaxy S23系列发布,包含Galaxy S23、Galaxy S23+和Galaxy S23 Ultra三个版本,全系搭载超频版骁龙8 Gen 2,虽同样采用台积电4nm工艺制
Top