首页 文章 精选 留言 我的

精选列表

搜索[2025生态大会观会有感],共10000篇文章
优秀的个人博客,低调大师

Battle:你会TLAB,我会逃逸分析

“噔噔噔…”传来一阵敲门声,把我从美梦中惊醒了。 朦胧间听到有人在说话“阿Q,在家不?” “来了来了”,推门一看,原来是“赵信”兄弟。 赵信:自称常山赵子龙,一把三爪长枪耍的虎虎生风,见人上去就是一枪,人送外号“菊花信”。 TLAB 尽管不是所有的对象实例都能够在TLAB中成功分配内存(因为它的空间比较小),但JVM明确是将TLAB作为内存分配的首选; 一旦对象在TLAB空间分配内存失败时,JVM就会尝试着通过使用加锁机制确保数据操作的原子性,从而直接在Eden空间中分配内存。 参数设置 -XX:UseTLAB:设置是否开启TLAB空间; -XX:TLABWasteTargetPercent:设置TLAB空间所占Eden空间的百分比大小,默认仅占1%; 堆是分配对象的唯一选择吗? 如果经过逃逸分析(Escape Analysis)后发现,一个对象并没有逃逸出方法,那么就可能被优化为栈上分配。这样就无需在堆上分配内存,也无须进行垃圾回收了。这也是最常见的堆外存储技术。 基于OpenJDK深度定制的TaoBaoVM,它创新的GCIH(GCinvisible heap)实现了堆外分配。将生命周期较长的Java对象从堆中移至堆外,并且GC不能管理GCIH内部的Java对象,以此达到降低GC的回收频率和提升GC的回收效率的目的。 举例一 public void method(){ User user = new User(); ... user = null; } user对象在方法内部声明,且在内部置为null,未被方法外的方法所引用,我们就说user对象没有发生逃逸。 它可以分配到栈上,并随着方法的结束,栈空间也随之移除。 举例二 public static StringBuffer createStringBuffer(String s1,String s2){ StringBuffer sb = new StringBuffer(); sb.append(s1); sb.append(s2); return sb; } 虽然sb对象在方法内部被定义,但是它又作为方法的返回对象,可被其它方法调用,我们就说sb对象发生了逃逸。 要想不发生逃逸,可以改造为: public static String createStringBuffer(String s1,String s2){ StringBuffer sb = new StringBuffer(); sb.append(s1); sb.append(s2); return sb.toString(); } 在JDK 6u23版本之后,HotSpot中默认开启了逃逸分析。 -XX:DoEscapeAnalysis:显式开启逃逸分析 -XX:+PrintEscapeAnalysis:查看逃逸分析的筛选结果 栈上分配 /** * 栈上分配测试 * -Xmx1G -Xms1G -XX:-DoEscapeAnalysis -XX:+PrintGCDetails */ public class StackAllocation { public static void main(String[] args) { long start = System.currentTimeMillis(); for (int i = 0; i < 10000000; i++) { alloc(); } long end = System.currentTimeMillis(); System.out.println("花费的时间为: " + (end - start) + " ms"); //为了方便查看堆内存中对象个数,线程sleep try { Thread.sleep(1000000); } catch (InterruptedException e1) { e1.printStackTrace(); } } private static void alloc() { //未发生逃逸 User user = new User(); } static class User { } } 逃逸分析默认开启,也可以手动开启:-XX:+DoEscapeAnalysis 关闭逃逸分析 同步省略 我们都知道线程同步的代价是相当高的,同步的后果就是降低了并发性和性能。 JVM为了提高性能,在动态编译同步块的时候,JIT编译器可以借助逃逸分析来判断同步块所使用的锁对象是否只能够被一个线程访问。 如果符合条件,那么JIT编译器在编译这个同步块的时候就会取消对这部分代码的同步。这个取消同步的过程就叫同步省略,也叫锁消除。 举例 public class SynchronizedTest { public void method() { Object code = new Object(); synchronized(code) { System.out.println(code); } } /** *代码中对code这个对象进行加锁, *但是code对象的生命周期只在method方法中 *并不会被其他线程所访问控制, *所以在 JIT 编译阶段就会被优化掉。 */ //优化为 public void method2() { Object code = new Object(); System.out.println(code); } } 在解释执行时这里仍然会有锁,但是经过服务端编译器的即时编译之后,这段代码就会忽略所有的同步措施而直接执行。 标量替换 标量:不可被进一步分解的量,如JAVA的基本数据类型就是标量; 聚合量:可以被进一步分解的量, 在JAVA中对象就是可以被进一步分解的聚合量。 聚合量可以分解成其它标量和聚合量。 标量替换,又名分离对象,即在JIT阶段,如果经过逃逸分析,发现一个对象不会被外界访问的话,那么经过JIT优化,就会把这个对象拆解成若干个其中包含的成员变量来替代。 举例 public class ScalarTest { public static void main(String[] args) { alloc(); } public static void alloc(){ Point point = new Point(1,2); } } class Point{ private int x; private int y; public Point(int x,int y){ this.x = x; this.y = y; } } //转化之后变为 public static void alloc(){ int x = 1; int y = 2; } //Point这个聚合量经过逃逸分析后,发现他并没有逃逸,就被替换成两个标量了。 标量替换默认开启,你也可以通过参数手动设置-XX:+EliminateAllocations,开启之后允许将对象打散分配到栈上,GC减少,执行速度提升。 常见的发生逃逸的场景 举例 public class EscapeAnalysis { public EscapeAnalysis obj; /* 为成员属性赋值,发生逃逸 */ public void setObj(){ this.obj = new EscapeAnalysis(); } //思考:如果当前的obj引用声明为static的?仍然会发生逃逸。 /* 方法返回EscapeAnalysis对象,发生逃逸 */ public EscapeAnalysis getInstance(){ return obj == null? new EscapeAnalysis() : obj; } /* 引用成员变量的值,发生逃逸 */ public void useEscapeAnalysis1(){ EscapeAnalysis e = getInstance(); //getInstance().xxx()同样会发生逃逸 } /* 对象的作用域仅在当前方法中有效,没有发生逃逸 */ public void useEscapeAnalysis(){ EscapeAnalysis e = new EscapeAnalysis(); } } 逃逸分析并不成熟 1999年就已经发表了关于逃逸分析的论文,但JDK1.6中才有实现,而且这项技术到如今也不是十分成熟。 其根本原因就是无法保证逃逸分析的性能提升一定能高于它的消耗,因为逃逸分析自身也需要进行一系列复杂的分析,是需要耗时的。 一个极端的例子,就是经过逃逸分析之后,发现所有对象都逃逸了,那这个逃逸分析的过程就白白浪费掉了。 细心的小伙伴也应该能发现,我们在抽样器中的截图其实就是在堆中分配的对象。 以上就是今天的所有内容了,如果你有不同的意见或者更好的idea,欢迎联系阿Q,添加阿Q可以加入技术交流群参与讨论呦! 后台留言领取java干货资料:学习笔记与大厂面试题

优秀的个人博客,低调大师

业界疑问,JuliaSet会取代Python吗?

云栖号:https://www.aliyun.com/#module-yedOfott8第一手的上云资讯,不同行业精选的上云企业案例库,基于众多成功案例萃取而成的最佳实践,助力您上云决策! 编程语言Python自上世纪九十年代诞生以来已经发展了很久。 今天,Python是应用最广泛的编程语言,有非常多的应用都使用了它。像企业级应用,机器学习和人工智能模型,或者数据科学工作中都有Python的身影,Python 几乎应用在所有蓬勃发展的行业和领域中。 恐怕连吉多·范罗苏姆(Guido Van Rossum)自己也不知道,他发明的Python会成为世界上最流行的编程语言之一。 Python现状 全世界有超过八百万的Python开发人员出于各种目的虔诚地使用Python。Python由于其动态的特性和优良的扩展性,受到了许多开发人员的偏爱。这也是Python打败开发者曾最喜欢的编程语言JAVA的原因。 但JAVA渐渐退出的原因也可能是出于一种语言的正常衰退过程,毕竟它已到了强弩之末。而很多新语言则为解决当代挑战而设计出来。由于语言的时效性,那些过去产生的语言解决当时的问题是很有效的,但对于日新月异的各行业而言,它们很难再跟得上当下的发展变化。 但Python作为一个开源语言,有非常强大的社区做支撑,因此它直到今天仍是最适应发展的语言。 它丰富的资源库、强大的内在功能是各组织、企业、开发者和科学家选择它的原因。尽管企业开发中仍会用到JAVA,但它在其他领域中的应用基本消失殆尽。也就是说,你不会发现有机器学习专家用JAVA设计和训练模型。虽然JAVA日渐衰退,它仍是全球第二大编程语言。 取代JAVA Python在很多领域里都成功地取代了JAVA,而在企业开发上,JAVA还面临着谷歌新编程语言GO的威胁。 此外,我们对高性能计算能力的需求与日俱增,这是数据科学和人工智能模型时代的需求。尽管有人觉得发展极限图形处理器能有效提升速度和效率,现实却可能相去甚远。它并不能满足数据处理的需求。相反,最先进的应用程序需要其他依赖项来优化性能、帮助科学家和开发人员完成预期目标。最终,这些表现将引导组织和研究机构寻找稳妥的编程语言,从而更适应利基(niche)任务和交付速度上的需要。 进入Julia的世界 正如前文所说,受到广泛喜爱的Python正受到后起之秀——Julia的威胁。 Viral Shah, Julia Computing的CEO指出:在本世纪初,开发者们更喜欢使用C语言进行系统编程,用JAVA进行企业应用开发,通过SaaS平台进行数据分析和Matlab中的科学计算。但如今开发者则喜欢用Rust语言进行系统编程,用Go语言进行企业开发,Python或R语言进行数据分析,再加上Julia一起进行科学计算。 而事实上,几年前我们还看不到这一番景象。 那时Julia还没有问世,在编程语言的选择上,渐渐从Matlab转向Python。在机器学习开始广泛应用后,由于Python数据库提供了更为便捷的ML模型安装,人们都转向使用Python。早前,Matlab不仅是完成这项任务的首选,更是数据分析和科学计算的最佳选择。但是,很明显,人们很容易接受易于理解、速度更快、性能更高和可扩展的解决方案。因此,Python能完美适应JAVA和Matlab的应用场景。 Julia的市场在哪里? Julia和Python的一个关键区别就在于两者处理一个特定问题的方式上。Julia设计目的就有想减轻面对高性能计算的挑战,而Python变成了这个挑战。 尽管Python仍能够应对行业的挑战,但是我们得接受它并不是为这项任务而设计的。开发者和研究者已足够幸运,能够见证并促进Python发展成为一个快速的编程语言。另一方面,Julia在设计时就将高速牢记在心。它只诞生了几个月而已,但已经在研究者和数据科学家间引起讨论了。 Julia的稳定版本1.2在两个月前发布,并且已经有了进一步改进,用以高效地处理资源密集型数据科学项目。目前已有超过800名开发人员在 Github 上为Julia的发展做出贡献,并帮助它成为更多人使用的语言。 作为资源丰富且高速的编程语言,仅仅两个月的Julia已经给了有三十载历史的Python沉痛一击。尽管现在断言Julia要取代Python还为时尚早,它一定能够因其独特的性质和处理复杂计算的能力而留下一笔。 此外,需要处理的问题要用到的资源越来越多,更要求严格的计算。凭借它超高的性能,Julia因此可能成为所所有人的最爱。Python如果不想和JAVA一样的命运,它必须改变游戏规则,并努力优化它的资源库以提高速度和效率。这种改变不仅仅是对程序的更新,而是完全转换引擎,使其成为一种对CPU更友好的语言。 相对于Julia而言,Python的一个优势就是其丰富的资源库。因为它还处于初级阶段,所以Julia需要很长时间才能开发出像Python这样的高效且动态的库和函数。 这两种语言之间的斗争才刚刚开始,但Julia已经成为需要快速且有效语言的研究人员和科学家的优势。 未来我们无法断定,但相信不管是否取代,留下来和运用的总是最适合时代的那一个。 你怎么看呢? 原文发布时间:2020-01-02本文作者:读芯术本文来自阿里云云栖号合作伙伴“读芯术”,了解相关信息可以关注“读芯术” 云栖号:https://www.aliyun.com/#module-yedOfott8第一手的上云资讯,不同行业精选的上云企业案例库,基于众多成功案例萃取而成的最佳实践,助力您上云决策!

优秀的个人博客,低调大师

为什么你的DevOps会失败?

DevOps的目标非常明确:使应用软件高效迭代,可靠,质量更好。这个目标非常理想,几乎所有人都不会对此产生异议。许多人都说,他们已经开始了DevOps的实践,正遵循一些常见的框架,比如“CALMS”。然而,能得到非常满意结果的并不多,我们在与200多名DevOps专业人士交谈后,做了以下的数据统计,希望你能从中得出一些结论:• 68%的人表示,DevOps中所需的多种工具之间缺乏连接性;• 52%的人表示,他们的大部分测试仍然是手动的,速度缓慢;• 38%的人表示,他们混合了传统和现代应用,使得环境变得非常混乱,这给应用部署策略和工具链等方面制造了很多麻烦;• 27%的人仍然在努力消除孤立的团队,追求所预期的协作;• 23%的人对自助服务基础设施的访问仍然受限;• 以及一些其他的问题:找不到正确

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册