被嘲笑了,这道经典面试题竟然不知道
周二早上好!今天也有java岗位上线,记得看看新机会哦
昨天一位朋友在面试中说,所有对象都在堆中创建,被面试官一阵嘲笑。
作为一个合格java开发者都知道,基本上所有对象都是在堆上创建。别忘了,是基本上所有,这就涉及到了今天的话题:逃逸分析。
开始正文。
逃逸分析(EscapeAnalysis)是什么?
通俗地讲,逃逸分析就是确定一个变量要放堆上还是栈上,是目前Java虚拟机中比较前沿的优化技术。这是一种可以有效减少Java程序中同步负载和内存堆分配压力的跨函数全局数据流分析算法。通过逃逸分析,JavaHotspot编译器能够分析出一个新的对象的引用的使用范围从而决定是否要将这个对象分配到堆上。
为什么需要逃逸?
我们来看看如果变量都分配到堆上了会出现什么结果:
1)垃圾回收(GC)的压力不断增大
2)申请、分配、回收内存的系统开销增大(相对于栈)
3)动态分配产生一定量的内存碎片
逃逸分析的基本原理是什么?
分析对象动态作用域,当一个对象在方法里面被定义后,它可能被外部方法所引用,例如作为调用参数传递到其他方法中,这种称为方法逃逸;甚至还有可能被外部线程访问到,譬如赋值给可以在其他线程中访问的实例变量,这种称为线程逃逸;从不逃逸、方法逃逸到线程逃逸,称为对象由低到高的不同逃逸程度。
FreemenappIT程序员的求职招聘平台,找IT工作,就来Freemen!
开启逃逸分析,编译器可以对代码进行如下优化:同步消除:如果一个对象被逃逸分析发现只能被一个线程所访问,那对于这个对象的操作可以不同步。栈上分配:如果确定一个对象不会逃逸出线程之外,那让这个对象在栈上分配内存将会是一个很不错的主意,对象所占用的内存空间就可以随栈帧出栈而销毁。标量替换:如果一个对象被逃逸分析发现不会被外部方法访问,并且这个对象可以拆散,那么程序真正执行的时候将可能不去创建这个对象,而改为直接创建它的若干个比这个方法使用的成员变量来代替。将对象拆分后,可以让对象的成员变量在栈上分配和读写。
JVM中通过如下参数可以指定是否开启逃逸分析:
XX:DoEscapeAnalysis:表示开启逃逸分析(JDK1。7之后默认开启)。
XX:DoEscapeAnalysis:表示关闭逃逸分析。同步消除
线程同步本身是一个相对耗时的过程,如果逃逸分析能够确定一个变量不会逃逸出线程,无法被其他线程访问,那么这个变量的读写肯定就不会有竞争,对这个变量实施的同步措施也就可以安全地消除掉。
如以下代码:publicvoidmethod(){ObjectonewObject();synchronized(o){System。out。println(o);}}
对对象o加锁,但是对象o的生命周期与方法method()一样,所以不会被其他线程访问到,不会发生线程安全问题,那么在JIT编译阶段会被优化为如下所示:publicvoidmethod(){ObjectonewObject();System。out。println(o);}
这也被称为锁消除。栈上分配
在Java虚拟机中,Java堆上分配创建对象的内存空间几乎是Java程序员都知道的常识,Java堆中的对象对于各个线程都是共享和可见的,只要持有这个对象的引用,就可以访问到堆中存储的对象数据。虚拟机的垃圾收集子系统会回收堆中不再使用的对象,但回收动作无论是标记筛选出可回收对象,还是回收和整理内存,都需要耗费大量资源。但是,存在一种特殊情况,如果逃逸分析确认对象不会逃逸出线程之外,那么就可能被优化成栈上分配。这样就无需在堆上分配内存,也无须进行垃圾回收了。
如以下代码:publicstaticvoidmain(String〔〕args)throwsInterruptedException{for(inti0;i1000000;i){alloc();}Thread。sleep(100000);}privatestaticvoidalloc(){UserusernewUser();}
代码很简单,就是循环创建100万次,使用alloc()方法创建100万个User对象。这里的alloc()方法中定义了User对象并没有被其他方法引用,所以符合栈上分配的要求。
JVM参数如下:Xmx2GXms2GXX:DoEscapeAnalysisXX:PrintGCDetailsXX:HeapDumpOnOutOfMemoryError
启动程序,通过jmap工具查看实例数:jmaphistopidnuminstancesbytesclassname1:37712198552〔B2:106171722664〔C3:1040571664912com。miracle。current。lock。StackAllocationTestUser
我们可以看到程序总共创建了104057个User对象,远小于100万。我们可以关闭逃逸分析再来看下:Xmx2GXms2GXX:DoEscapeAnalysisXX:PrintGCDetailsXX:HeapDumpOnOutOfMemoryError
启动程序,通过jmap工具查看实例数:jmaphisto42928numinstancesbytesclassname1:62822299176〔I2:100000016000000com。miracle。current。lock。StackAllocationTestUser
可以看到,关闭逃逸分析后总共创建了100万个User对象。对比来看,栈上分配对堆内存消耗,GC都有着重要的作用。标量替换
若一个数据已经无法再分解成更小的数据来表示了,Java虚拟机中的原始数据类型(int、long等数值类型及reference类型等)都不能再进一步分解了,那么这些数据就可以被称为标量。相对的,如果一个数据可以继续分解,那它就被称为聚合量(Aggregate),Java中的对象就是典型的聚合量。
假如逃逸分析能够证明一个对象不会被方法外部访问,并且这个对象可以被拆散,那么程序真正执行的时候将可能不去创建这个对象,而改为直接创建它的若干个被这个方法使用的成员变量来代替。
有如下代码:publicstaticvoidmain(String〔〕args){method();}privatestaticvoidmethod(){UserusernewUser(25);System。out。println(user。age);}privatestaticclassUser{privateintage;publicUser(intage){this。ageage;}}
在method()方法中创建User对象,指定age为25,这里User不会被其他方法引用,也就是说它不会逃逸出方法,并且User是可以拆解为标量的。所以alloc()代码会优化为如下:privatestaticvoidalloc(){intage25;System。out。println(age);}总结
尽管目前逃逸分析技术仍在发展之中,未完全成熟,但它是即时编译器优化技术的一个重要前进方向,在日后的Java虚拟机中,逃逸分析技术肯定会支撑起一系列更实用、有效的优化技术。
文章来源于Java后端技术全栈,作者田哥
今日推荐:
JAVA开发工程师
任职要求:
1、本科及以上学历,计算机或相关专业,3年以上Java开发经验,负责过软件项目的设计与开发;
2、熟练掌握基于Web的应用程序开发,理解SprinMVC、SpringBoot,SpringCloud,MyBaits等主流框架开发过程,掌握缓存机制(Redis、Memcached)和MQ消息机制;
3、精通SQL语言、熟悉Mysql或Oracle数据库,具有丰富的数据库开发经验,有SQL性能调优经验者优先;
4、熟悉分布式、多线程、高并发及高可用的设计、编码和调优;熟悉大流量、高并发、高性能的分布式系统的设计及应用,擅长性能调优者优先;
5、乐于学习,积极分享,有Github开源项目优先。
语言要求:英语公共英语四级
薪资:15k30k
工作地点:北京
脸上的这种痘印怎么祛?痘印是许多人面对的问题。它们是由于炎症导致的皮肤病变,通常表现为色素沉着或疤痕。痘印可以影响人们的外貌和自信心,但是有很多方法可以减少它们的外观。以下是一些可以帮助祛除痘印的方……
指纹为何都是独一无二的地球上再也没有人拥有你完全一样的指纹。即使你碰巧有一个同卵双胞胎,你手脚指头上的漩涡状脊纹也将是你所独有的特征。科学家们一直想知道是哪些因素决定了指纹图案的唯一性。……
光污染淹没星空速度超乎想象德国科学家的一项新研究显示,全球光污染正在淹没世界上许多地方的星空,而且情况每年都在恶化。相关研究1月19日发表于《科学》。这个问题比我们之前认为的更严重。未参与该研究的……
荣耀80GT将于12月26日发布,性能美学新标杆将上线!今早消息,荣耀官宣将在12月26日发布荣耀80GT新品,据悉,这次的全新系列也相当有料,不但有强悍性能,还体现了精致美学,致力于打造性能美学新标杆。消息一经曝光,瞬间就引……
玉琴掐腰大骂新欢,后者为讨老妻欢心送廉价珠宝,网友绿茶本茶马玉琴和李玉成是一对相差32岁的老妻少夫,两人携手相伴度过了27年。可是自从马玉琴被子孙接回家尽孝后,一切都发生了变化。原本眼中都是马玉琴的李玉成,身边突然出现了一位年轻……
这种粗粮升血糖伤血管,很多人吃了一辈子,吃得都不对随着大家越来越重视饮食健康粗粮富含膳食纤维、维生素、矿物质受到好多人追捧然而生活中很多人吃了一辈子吃的都是假粗粮不仅无法提供相应的营养物质……
我国在大庆开采的特大油田能否缓解能源紧张局面?还需要进口吗?引言中国社会在最近几年加入发展的快车道,中国制造和高端工业产品的生产都需要大量的石油,这也意味着我国对石油的需求量一直处于高速的增长阶段。与此同时,世界范围内能源的紧张局……
中国厂商将主导RISCV产业发展!在目前的CPU市场,x86架构及Arm架构仍然是全球最为主流的指令集架构。其中,x86架构统治着PC及服务器市场,而Arm架构则几乎完全垄断了移动市场。近年备受追捧的RISCV……
家有小霸王,该如何是好?家里有个调皮淘气的孩子,真的让人头疼啊,打也不行,吼也没用。唉,俗话说:三岁宝宝狗都嫌。这句话还是有点道理的。他在家里各种作妖,一会儿看不到就在干坏事,拆家的程度快赶上二……
有品之人,人人尊敬善良之人,天必佑之做人,重在人品,贵在良心有品之人,人人尊敬;善良之人,天必佑之人生最大的价值,不在于财富多少,不在于学问高低,而在于人品和良心。有品之人,受人尊重,被人爱戴。……
中国楼市还能不能迎来第二个2016我是出来打击中介的,实在看不下去中介满嘴跑火车了。我不知道别的地方的中介怎么样,我们石家庄的,呵呵,真的醉了。只要是个政策,房地产政策,ok你鼓吹,不是房地产政策,就是降储备金……
都说今年经济不好,为何便宜手机无人问津,高端手机却抢购加价?不是俺不明白,而是这世界变化快!因为口罩的原因,目前全球经济都处在一个强烈的下行周期当中。其中一个值得关注的数据就是,曾经引领全球经济的智能手机行业也出现了比较大的跌幅,……