咨询热线:15854677166 联系人:尤总 地址:云南省昆明市经开区云大西路创业大厦B幢401号
Java中堆、栈,静态方法和非静态方法的速度问题
来源:宝马会备用手机版 发布时间:2019-11-17 点击量:132
一、堆和栈的速度性能分析
堆和栈是JVM内存模型中的2个重要组成部分,自己很早以前也总结过堆和栈的区别,基本都是从存储内容,存储空间大小,存储速度这几个方面来理解的,但是关于堆和栈的存储速度,只知道堆存储速度慢,栈存储速度快,至于为什么堆比栈的存取速度慢,并没有特别深入的研究,从网上也找了很多资料,但很多理由并不太认同,这里也列举一些,并结合自己的理解来分析,如果不正确欢迎指正。
1、从分配的角度分析
java中栈的大小和生命周期在编译期间就确定了的(可以参考之前写的一篇JVM内存模型中的分析,本周末会写一篇该系列知识点中GC策略和GC收集器的博客),而堆是在运行时动态分配的,这会花不少时间,因此从分配的角度来说,堆比栈速度慢。
2、从访问角度分析
网上很多文章都说访问栈只需1次,而访问堆需要2次,一次取地址,第二次根据地址去访问对象,这个观点我并不是完全认同。我们知道,虚拟机栈中存储的是一个个栈帧,每个栈帧中存储的是一些局部变量表,操作数,动态链接和返回地址等,当访问栈的时候,一次访问就可以获取这些数据,而java中访问堆对象的方式主要有2种:通过直接指针和句柄访问,直接指针的方式有点类似于数组的首地址,通过直接指针能快速找到这个对象,只需1次访问。这种方式相比句柄的好处是速度更快,但缺点也很明细:当进行GC的时候,地址会发生变化,而GC是很频繁的。另一种方式是句柄,句柄就相当于一个小区的门卫,当你要找这个小区里的某个住户时(这个住户很有钱很任性,每天住在不同的楼层和房间),你要先去找门卫,门卫会告诉你这个人他今天在哪栋楼哪个房间,然后你再到这个房间去找就行了。这样一来你就需要访问2次(1次门卫,再根据门卫去找住户)。这样速度自然就慢了,但这种方式的好处就是:通过门卫你永远都能知道这个住户在哪里,不管住户怎么变(GC过程中对象会频繁移动,导致地址会频繁变更)。因此我的理解应该是:如果堆使用的是直接指针的方式的话,从访问角度来说,应该区别不大,当然如果是句柄的方式,倒有些道理。
3、从CPU命中率角度分析
我们知道CPU有3级缓存,一级缓存速度最快,接近CPU的速度,但是一级缓存比较小,二级缓存速度次之,空间稍大,三级缓存速度又慢些,空间又大些,而且CPU读取的时候是按行来读取的,比如64位的机器每次读取的就是64位,相当于每次可以读取2个int类型的长度,每次读取某个数据的时候,可能会把相邻的数据一块读取进来,而栈占用的空间小,这样CPU的命中率会更高些,而且淘汰率会更低,而堆占用的空间大,相对来说,每次读取命中率更低了,淘汰率也更高,因此从这个角度来说,栈也比堆要快写。
上面说的是堆和栈的存储速度区别,下面再来分析下静态方法和非静态方法的速度比较。
二、静态方法和非静态方法(已经创建对象前提下)执行性能分析
其实之前的直觉是静态方法的访问速度应该会比非静态方法快,因为静态方法在加载类的时候就存到方法区了,运行时可以直接调用,而非静态方法调用时需要先初始化对象再来调用,那问题来了:假如对象已经初始化了,再调用静态方法和非静态方法哪个快呢?开始以为非静态方法要快,因为非静态方法是存储在虚拟机栈中的,而栈的访问速度是比较快的,但是这并不严谨,那就来个实验吧。
下图是多次运行的结果:
第一次:
第二次:
第三次:
第四次:
可以看到,循环10000次的结果里,非静态方法的执行速度4次里有3次都比静态方法快。再来个100000次的循环看看结果:
第一次:
第二次:
第三次:
第4次:
这个就更明显了,所以就实验结果而言,如果在已经创建对象的前提下,非静态方法的访问速度是比静态方法的访问速度快的。但是至于原因,上面的理由感觉还是有点勉强,依旧不是很清楚,欢迎各位大神指点
, 1, 0, 9);
相关产品
-
而就算台湾已经为此付出这般沉重的代价,也未见所有任何涉及此一风暴的当事人,为此道一声歉,或是在道德上、伦理上做出任何最起码的反省,那怕只是表面的演戏都没有。迄今为止,涉关说的不承认有关说,涉违法的不承认有违法,涉乱纪的不承认有乱纪,所有第三方的公正评鉴都被质疑、被反呛,党派立场凌驾一切,声音大的永远占上风,是非公道根本就没人在乎,一场“九月风暴”,所映照台湾台面人物的面貌,还真是令人摇头。
-
许键豪也有同感,并指出:“超市一出现,很多杂货店店主感到紧张而拼命削价,结果造成同行之间互相竞争的局面。加上租金、水电费、工人费等杂费,每个月的收入实在不多。”
-
省委常委,省人大常委会党组主要负责同志出席会议。中央纪委有关同志,各市市委书记,省委各部委,省(中)直各单位党组(党委)、各人民团体党组主要负责同志、纪检组组长(纪委书记); 部属省属本科高等院校党委、省属企业党委主要负责同志、纪委书记等,共430余人参加会议。
-
2015世界女子高尔夫锦标赛将于3月12-15日在海口观澜湖黑石球场举行,目前108人参赛阵容已敲定,现世界排名第二的韩国名将朴仁妃、世界第五的挪威名将苏珊·佩特森和世界第八的柳先暎将领衔出战。
-
北京首都,天然就集聚了人才、信息、科技、资本等诸多优质、核心的市场要素。企业总部,将依托上述生产力,使企业获得发展的加速度。
-
东航计划取消8月2日12:00前在珠三角地区(广州、深圳、香港、澳门、珠海)起降的全部航班;海南航空8月1日取消11个到达或从深圳出发的航班;截至8月1日下午16:30,深圳航空取消1日-2日深圳机场航班92班、广州航班52班;春秋航空8月1日取消航班共计23班;吉祥航空、台湾虎航、香港航空等也都取消了部分相关航班。
-
7月26日上午,甘肃首部反映反腐倡廉题材的电影《别让妈妈流泪》首映仪式在兰州举行。图为电影剧照。 钟欣 摄
-
为了对因园区停运而蒙受损失的企业提供支援,韩国政府决定发放3300亿韩元(约合人民币17.5亿元)额度的经济合作保险金。有关部门于22日开始接受申请,但当天没有一家企业提出申请。
热点资讯
- 生态环境部:江西省德兴德邦市化学品环境违法案件立案监督2019-11-10
- 德国政府放行,奥迪飞行汽车进入测试阶段2019-11-05
- 《魔兽世界:怀旧服》终极画质vs经典画质对比2019-07-17
- 3分钟简单了解prototype和__proto__2019-11-13
- 首届中国冰雪大会开幕邀请市民感受冰雪魅力2019-07-17
- 开设网上商店的门槛会提高吗?市场监管总局的应对措施2019-10-31
- 《火影忍者》蝎战斗雕像运“风”踩琥气势十足2019-10-29
- 在DNA上存储信息的成本已足够便宜:商业化可期2019-07-17