当前位置: 首页 > news >正文

福建省城乡建设委员会网站北京互联网公司排名

福建省城乡建设委员会网站,北京互联网公司排名,微信公众号api,网站源码之家开发者都知道,基本上所有对象都是在堆上创建。但是,这里还是没有把话说绝对哈,指的是基本上所有。昨天一位朋友在聊天中,就说了所有对象都在堆中创建,然后被朋友一阵的嘲笑。 开始我们的正文,我们今天来聊聊…

开发者都知道,基本上所有对象都是在堆上创建。但是,这里还是没有把话说绝对哈,指的是基本上所有。昨天一位朋友在聊天中,就说了所有对象都在堆中创建,然后被朋友一阵的嘲笑。

开始我们的正文,我们今天来聊聊关于逃逸分析。

逃逸分析(Escape Analysis)是目前Java虚拟机中比较前沿的优化技术。这是一种可以有效减少Java 程序中同步负载和内存堆分配压力的跨函数全局数据流分析算法。通过逃逸分析,Java Hotspot编译器能够分析出一个新的对象的引用的使用范围从而决定是否要将这个对象分配到堆上。

逃逸分析的基本原理是:分析对象动态作用域,当一个对象在方法里面被定义后,它可能被外部方法所引用,例如作为调用参数传递到其他方法中,这种称为方法逃逸;甚至还有可能被外部线程访问到,譬如赋值给可以在其他线程中访问的实例变量,这种称为线程逃逸;从不逃逸、方法逃逸到线程逃逸,称为对象由低到高的不同逃逸程度。

开启逃逸分析,编译器可以对代码进行如下优化:

  1. 同步消除:如果一个对象被逃逸分析发现只能被一个线程所访问,那对于这个对象的操作可以不同步。
  2. 栈上分配:如果确定一个对象不会逃逸出线程之外,那让这个对象在栈上分配内存将会是一个很不错的主意,对象所占用的内存空间就可以随栈帧出栈而销毁。
  3. 标量替换:如果一个对象被逃逸分析发现不会被外部方法访问,并且这个对象可以拆散,那么程序真正执行的时候将可能不去创建这个对象,而改为直接创建它的若干个比这个方法使用的成员变量来代替。将对象拆分后,可以让对象的成员变量在栈上分配和读写。

JVM中通过如下参数可以指定是否开启逃逸分析:

-XX:+DoEscapeAnalysis :表示开启逃逸分析(JDK 1.7之后默认开启)。

-XX:-DoEscapeAnalysis :表示关闭逃逸分析。

同步消除

线程同步本身是一个相对耗时的过程,如果逃逸分析能够确定一个变量不会逃逸出线程,无法被其他线程访问,那么这个变量的读写肯定就不会有竞争,对这个变量实施的同步措施也就可以安全地消除掉。

如以下代码:

public void method() {Object o = new Object();synchronized (o) {System.out.println(o);}
}

对对象o加锁,但是对象o的生命周期与方法method()一样,所以不会被其他线程访问到,不会发生线程安全问题,那么在JIT编译阶段会被优化为如下所示:

public void method() {Object o = new Object();System.out.println(o);
}

这也被称为锁消除。

栈上分配

在Java虚拟机中,Java堆上分配创建对象的内存空间几乎是Java程序员都知道的常识,Java堆中的对象对于各个线程都是共享和可见的,只要持有这个对象的引用,就可以访问到堆中存储的对象数据。虚拟机的垃圾收集子系统会回收堆中不再使用的对象,但回收动作无论是标记筛选出可回收对象,还是回收和整理内存,都需要耗费大量资源。但是,存在一种特殊情况,如果逃逸分析确认对象不会逃逸出线程之外,那么就可能被优化成栈上分配。这样就无需在堆上分配内存,也无须进行垃圾回收了。

如以下代码:

public static void main(String[] args) throws InterruptedException {for (int i = 0; i < 1000000; i++) {alloc();}Thread.sleep(100000);
}private static void alloc() {User user = new User();
}

代码很简单,就是循环创建100万次,使用alloc()方法创建100万个User对象。这里的alloc()方法中定义了User对象并没有被其他方法引用,所以符合栈上分配的要求。

JVM参数如下:

-Xmx2G -Xms2G -XX:+DoEscapeAnalysis -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError 

启动程序,通过jmap工具查看实例数:

jmap -histo pidnum     #instances         #bytes  class name
----------------------------------------------
1:          3771        2198552  [B
2:         10617        1722664  [C
3:        104057        1664912  com.miracle.current.lock.StackAllocationTest$User

我们可以看到程序总共创建了104057个User对象,远小于100万。我们可以关闭逃逸分析再来看下:

-Xmx2G -Xms2G -XX:-DoEscapeAnalysis -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError 

启动程序,通过jmap工具查看实例数:

jmap -histo 42928num     #instances         #bytes  class name
----------------------------------------------1:           628       22299176  [I2:       1000000       16000000  com.miracle.current.lock.StackAllocationTest$User

可以看到,关闭逃逸分析后总共创建了100万个User对象。对比来看,栈上分配对堆内存消耗,GC都有着重要的作用。

标量替换

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

假如逃逸分析能够证明一个对象不会被方法外部访问,并且这个对象可以被拆散,那么程序真正执行的时候将可能不去创建这个对象,而改为直接创建它的若干个被这个方法使用的成员变量来代替。

有如下代码:

public static void main(String[] args) {method();
}private static void method() {User user = new User(25);System.out.println(user.age);
}private static class User {private int age;public User(int age) {this.age = age;}
}

在method()方法中创建User对象,指定age为25,这里User不会被其他方法引用,也就是说它不会逃逸出方法,并且User是可以拆解为标量的。所以alloc()代码会优化为如下:

private static void alloc() {int age = 25;System.out.println(age);
}

总结

尽管目前逃逸分析技术仍在发展之中,未完全成熟,但它是即时编译器优化技术的一个重要前进方向,在日后的Java虚拟机中,逃逸分析技术肯定会支撑起一系列更实用、有效的优化技术。

http://www.khdw.cn/news/4610.html

相关文章:

  • wordpress 招聘网站关键词林俊杰mp3免费下载
  • 个人建站除了wordpress怎么做起泡胶
  • wap网站seo上饶seo博客
  • 网站上滚动海报怎么做的太原百度网站快速排名
  • 网站做响应式还是移动端网站外链分析工具
  • 国外b2b平台有哪些网站太原seo快速排名
  • 美丽乡村网站建设模板廊坊百度关键词优化怎么做
  • WordPress迁移网站打不开百度网盘网页版
  • 政工网站建设方案网上电商怎么做
  • 网站的建设背景图片百度关键词优化
  • 什么网站可以做微招聘志鸿优化设计
  • 云南网站开发公司介绍外贸网站优化公司
  • NET网站开发工程师网站招聘中国搜索引擎份额排行
  • 电商平台如何引流推广seo网站推广怎么做
  • 怎么在360做网站百度公司介绍
  • django怎么做网站360优化大师下载
  • 网站建设案例要多少钱seo优化怎么做
  • 天然气集团有限公司原副总经理汉川seo推广
  • 简单网站建设产品推广方案范例
  • 做网站临沂厦门seo顾问屈兴东
  • 福田网站制作公司长尾关键词排名工具
  • 南头手机公司网站建设网络营销专业是干嘛的
  • 用动态和静态设计一个网站磁力天堂最新版地址
  • 网站开发做美工安装百度
  • 软件推广网站域名收录查询
  • 大良营销网站建设市场微网站建站平台
  • 东莞做网站首选企业铭软文有哪些
  • 国际电商平台排名短视频seo询盘获客系统软件
  • 织梦网站怎么做301百度小说排行榜前十
  • 广州网站ui设计中文搜索引擎网站