被嘲笑了,这道经典面试题竟然不知道
周二早上好!今天也有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
工作地点:北京
截至目前,盘点2022年采用柔性直屏的手机1iPhone14搭载满血版A15仿生处理器,采用台积电5nm工艺制程,拥有卓越的性能以及超低功耗,无论游戏还是日常,都游刃有余正面是一块6。1英寸的AMOLED柔性直屏,支持1。
我18年间用过的七部手机,流水账第一部三星S508,Anycall,银色。有生以来第一部手机,2004年初买的,当时就感觉这个手机挺好看的,流线设计。彩屏,32和弦。当时花了我2400多大洋(相当于两个月的工资)
重庆生产重炮的军工厂,隐秘在大山之中,生而伟大消逝无息上世纪80年代逐步解封的三线建设,对于今天的年轻人来说,仍旧是一个十分陌生的名词。沧海桑田,恍如隔世,三线建设的功过是非也已尘埃落定,但那一段激情岁月和几百万三线人的跌宕历史,至今
林丹深圳湾开羽毛球馆,价格与国际接轨,有网友说消费不起林丹现在转身当老板了,他刚刚在深圳湾开了一家羽毛球馆,是收费的那种,据说价格挺贵的,与国际接轨,一小时没个四五百下不来。林丹自从上次出轨新闻爆出之后,老实了很多,后来就没见他有这些
三展齐发,向世界展示深圳时尚设计新锐创新力量作为融合设计与时尚的重要品牌与创新活动2022深圳国际青年服装设计创意周再次拉开序幕。12月11日12月26日,中国时装画大展中国著名服装设计师作品邀请展新媒体时尚跨界融合特展三大
建议男人生活别太节俭,常吃这5样家常菜,补充营养身体棒冬日生活打卡季男人是家里的一片天,他们吃过很多苦,也受过很多累,一边要顾家里,一边还要努力工作,可以说是身心都累。对于男人,生活中一定不要太节俭,身体是革命的本钱,家庭工作固然重要
二零二二太二了2过完年三月初,我们又轮换到上海带孙了。当时全国疫情总体平稳,完全没有要阻断出行的迹象。初春的上海寒意料峭,树大都还是光凌凌的。人们都小心谨慎地过着活,生怕防疫优良的天花板被人为地打
王赓陆小曼前夫,忍痛成全妻子,苦等复婚被拒绝,48岁客死他乡1926年10月3日,正值农历的七月初七,也是中国的情人节,这一天是陆小曼和徐志摩大婚之日。婚礼在北海公园画舫斋举行,陆小曼从离婚到结婚等了整整八个月,现在能和有情人终成眷属,她和
巨人为什么消失了?巨人真的存在吗?在世界各国各民族的古代典籍中,包括神话里,我们经常听到巨人的传说。现在人身高普遍1米7到1米8左右,能够达到2米绝对是凤毛麟角算是巨人了。近代人看到并验证的最高个子
2001年,豫西年轻女教师被男家长猥亵,女教师如何脱身?河南省豫西伏牛山是一块红色土地,曾经的名战场。2001年的时候,这里的一位年轻女教师被一个流氓家长缠上,她含泪受辱,巧斗流氓家长,让正义得到了伸张。豫西伏牛山是一座名山。1947年
抗美援朝时,他被掩埋地下38小时,因两只苍蝇获救,后成开国少将苍蝇,你喜欢吗?这样滑稽的问题,恐怕问谁,谁都会脱口而出不喜欢!但今天要聊的这位,他是一位开国将帅,在他的眼中,苍蝇就是自己的恩人。王扶之将军他叫王扶之,是目前仍然在世的9位开国将