Java 20年,以后将往哪儿走?(java未来前景)
wptr33 2025-03-20 20:06 23 浏览
在今年的Java 20周年的庆祝大会中,JavaOne 2015 的中心议题是“Java 的20年”。甲骨文公司Java平台软件开发部的副总裁Georges Saab的主题演讲就将关注点放在了java的发展历程、它主要的发展里程碑,并且深度关注于Java8及其更新。甲骨文公司Java平台首席架构师Mark Reinhold的主题演讲奠定了Java发展的路线图,并展示了定于2016年Q3季度发布的Java9 。
Reinhold提到Java成功的关键在于辨识到了痛点;找出了缺失的抽象类并添加了抽象类,以此方式来满足现有的解决方案。
Reinhold还说到“目标是随着时间的推移,要持续改善开发人员的开发效率,同时保留Java的可读性、简化性、通用性以及兼容性的核心价值。”
他推断,缺失的抽象类已经引领了Java5的泛型与Java8的lambdas表达式中的重大创新。2008年,Jigsaw项目引入了模块的概念,以此来解决两个不同的痛点:类路径地狱(Classpath Hell)和庞大的单体 JDK。
类路径地狱(Classpath Hell)
据Reinhold所称,类路径(Classpath)的根本问题在于它们不仅仅是类。他说“类路径是一种查找类的方式,不必关心组件、包甚至它们的预期用途。”
在类路径中,甚至都无法确定你们寻找的类就在jar文件内;我们也不知道是否有任何与应用开发接口相关的冲突。并且,当开发人员不知道或是不理解内部接口的目的,并对其进行改变时,内部接口就可能会暴露出一些安全问题。
关注InfoQ[ID:infoqchina]了解更多技术领域干货内容。
据Reinhold所称,模块为jar文件提供了一个强有力的抽象类,模块是一个程序组件,它不仅能在java编程语言中实现,在java 虚拟机中同样也能。正如他所说的“模块是脱离类路径地狱(Classpath Hell)的关键。”
模块可被看做是包的容器,与此同时,该模块也表述了它与其他模块是如何联系的;
模块是包的容器;
模块为其依赖的其他模块命名;
一个模块不会对其他模块进行干扰;
模块只有通过其它依赖它的模块才能输出特定的包来使用。
为了在Java9中使用模块,所需的jar文件中的模块必须在module-info.java文件中进行声明。文件名不是一个类的名字,它是一个约定,就像package-info.java一样;但它仍可以通过javac进行编译。模块化的jar文件包含module-info.class。该模块化的jar文件可作为一个单独的产物进行传送;对于java9预先发布的版本来说,模块化jar文件就像常规jar文件一样运行。
Reinhold提到,通过允许终端用户以从下到上或从上到下的方式将现有的系统进行模块化,模块的采用就大大地简化了。
单体JDK
Jigsaw项目提供了很多新的用例,传统意义上来讲这些用例不适合庞大的单体Java SE JDK。某些用例包括:
小型设备——没有足够空间去存储所有的Java SE 包。
云应用——不需要复制整个的Java SE JDK。因为在云中,密度是主要因素。(注:密度指的是能为一套特定的软硬件进行交付的系统与服务的数量。)
维护与安全——庞大、整体化的JDK系统在子系统之间存在着千丝万缕的联系。并且,它缺乏内部接口的封装,这会导致安全问题。
据Reinhold所称,“模块为强有力的封装提供可依赖的配置。”
有了模块化,伴随着增强的安全性,开发人员只使用需要的功能。因此,在JDK 9中,所有非关键的内部接口将被封装。某些关键的内部接口例如sun.misc.Unsafe仍然可以访问。(绝大部分)内部接口封装的提出表明“JDK 9中引入的、替换掉原有版本的关键内部接口在JDK 9中将被弃用,或者被封装或者在JDK 10中被删除。”Reinhold 提到被封装后的内部接口仍可以在编译时和运行时通过命令行标志来进行访问。
在JavaOne 2015主题演讲上,甲骨文公司Java平台开发部的负责人Georges Saab、Mark Reinhold、Brian Goetz与其他人一起,谈论了Java20年来的发展历程。
在本文的第一部分,InfoQ介绍了Reinhold的主题演讲。现在,我们将介绍Brian Goetz,他是Java平台开发部的Java语言架构师,他窥见了Java10甚至更高版本的所有内在机理,尤其是谈论到Valhalla项目和Panama项目,而它们正是为Java 虚拟机和Java语言本身孕育重大进展的两个项目。这些进展旨在丰富Java虚拟机与底层硬件(包括操作系统)以及非Java应用编程接口之间的关联。
动机
随着时间的推移,越来越复杂的处理器核心设计已经影响了成本模型的时钟周期和底层硬件/中央处理器内核的分发槽问题。高速缓存缺失是非常昂贵的,尤其是当你还需要从主内存中读取数据的时候。因此急需Java和Java虚拟机具有更密集和平整的内存布局来提供更好的缓存和内存效率,从而跟上当今时代硬件的发展步伐。
Valhalla项目
Goetz提到Valhalla项目包括了一些Java语言和Java虚拟机的特色,这些特色用于与纯数据共同协作,而这些纯数据不包含对象强加的所有开销。他为我们举了以下的例子,并进行了相应的解释:
假设有一个简单的域对象 Point Class:
class Point { final int x; final int y; }
一个X-Y的实例数组会伴随着150%的内存开销,只为表示数据的两个词;一个两个词的对象头(通常用于所有的对象)及其元素,作为Point对象的引用,再加上每一个Point对象的头:
值类型
如果Point类不可改,我们就不要求它的身份;我们可以将Point类以数值类的形式定义为一个纯数据类型的Point。
value class Point { final int x; final int y; }
在这个例子里,这样的数值类型将不存在间接引用。因此,我们拥有一个友好的高速缓存布局,而这个布局不仅可以高效地使用内存,还具有更好的局域性。
据Goetz称:
数值类型就像类和基元之间的高速公路…从代码上来说,它们像类,但是从表现上来说,它们像整型变量。
特化泛型
有人提议通过增强Java语言和Java虚拟机来加强对超基元泛型的支持。关于数值类型的好消息就是它们可以向基元类型那样装箱了。结果,泛型被支持的程度最终也将超过所有数值类型。
据Goetz所称,即便你工作时用的是:
ArrayList
但实际上你想要的是:
ArrayList
因此现阶段核心Java库中无法实现你用前者工作却追求后者。但当你指定
ArrayList
其内存控制和内存开销的低效性与之前x-y Point类数组的例子十分相似。
如果指定:T为整型,对T进行装箱(Box
Panama项目
接下来,Goetz继续讨论Panama项目,该项目旨在为本地数据(例如:本地堆中的数据)和本机代码(例如:C中的函数)以更快、更加可信和更加安全的方式提供Java虚拟机的访问权限。
在Panama项目中,名为jextract的本地头文件输入工具会提取布局元数据(例如:C的头文件),并生成Java接口去调用本地方法或访问本地结构。在运行时期间,Java虚拟机会生成与用户可能编写的JNI代码相似的代码。
Goetz为我们举了个例子,该例子需要将指针传递给结构,以便从time.h中调用gettimeofday。因此,我们采用jextract来解析头文件,同时也会得到机器类型的信息。所得到的jar文件具有结构的定义和方法的声明。
因此,所有需要调用上述方法的类与结构都是时间库的参考,同时也是一种结构的创造,正如以下代码所示。
正如上述代码所示,之后想要获取属性就像调用getter方法一样简单了。
相关推荐
- oracle数据导入导出_oracle数据导入导出工具
-
关于oracle的数据导入导出,这个功能的使用场景,一般是换服务环境,把原先的oracle数据导入到另外一台oracle数据库,或者导出备份使用。只不过oracle的导入导出命令不好记忆,稍稍有点复杂...
- 继续学习Python中的while true/break语句
-
上次讲到if语句的用法,大家在微信公众号问了小编很多问题,那么小编在这几种解决一下,1.else和elif是子模块,不能单独使用2.一个if语句中可以包括很多个elif语句,但结尾只能有一个else解...
- python continue和break的区别_python中break语句和continue语句的区别
-
python中循环语句经常会使用continue和break,那么这2者的区别是?continue是跳出本次循环,进行下一次循环;break是跳出整个循环;例如:...
- 简单学Python——关键字6——break和continue
-
Python退出循环,有break语句和continue语句两种实现方式。break语句和continue语句的区别:break语句作用是终止循环。continue语句作用是跳出本轮循环,继续下一次循...
- 2-1,0基础学Python之 break退出循环、 continue继续循环 多重循
-
用for循环或者while循环时,如果要在循环体内直接退出循环,可以使用break语句。比如计算1至100的整数和,我们用while来实现:sum=0x=1whileTrue...
- Python 中 break 和 continue 傻傻分不清
-
大家好啊,我是大田。今天分享一下break和continue在代码中的执行效果是什么,进一步区分出二者的区别。一、continue例1:当小明3岁时不打印年龄,其余年龄正常循环打印。可以看...
- python中的流程控制语句:continue、break 和 return使用方法
-
Python中,continue、break和return是控制流程的关键语句,用于在循环或函数中提前退出或跳过某些操作。它们的用途和区别如下:1.continue(跳过当前循环的剩余部分,进...
- L017:continue和break - 教程文案
-
continue和break在Python中,continue和break是用于控制循环(如for和while)执行流程的关键字,它们的作用如下:1.continue:跳过当前迭代,...
- 作为前端开发者,你都经历过怎样的面试?
-
已经裸辞1个月了,最近开始投简历找工作,遇到各种各样的面试,今天分享一下。其实在职的时候也做过面试官,面试官时,感觉自己问的问题很难区分候选人的能力,最好的办法就是看看候选人的github上的代码仓库...
- 面试被问 const 是否不可变?这样回答才显功底
-
作为前端开发者,我在学习ES6特性时,总被const的"善变"搞得一头雾水——为什么用const声明的数组还能push元素?为什么基本类型赋值就会报错?直到翻遍MDN文档、对着内存图反...
- 2023金九银十必看前端面试题!2w字精品!
-
导文2023金九银十必看前端面试题!金九银十黄金期来了想要跳槽的小伙伴快来看啊CSS1.请解释CSS的盒模型是什么,并描述其组成部分。答案:CSS的盒模型是用于布局和定位元素的概念。它由内容区域...
- 前端面试总结_前端面试题整理
-
记得当时大二的时候,看到实验室的学长学姐忙于各种春招,有些收获了大厂offer,有些还在苦苦面试,其实那时候的心里还蛮忐忑的,不知道自己大三的时候会是什么样的一个水平,所以从19年的寒假放完,大二下学...
- 由浅入深,66条JavaScript面试知识点(七)
-
作者:JakeZhang转发链接:https://juejin.im/post/5ef8377f6fb9a07e693a6061目录由浅入深,66条JavaScript面试知识点(一)由浅入深,66...
- 2024前端面试真题之—VUE篇_前端面试题vue2020及答案
-
添加图片注释,不超过140字(可选)1.vue的生命周期有哪些及每个生命周期做了什么?beforeCreate是newVue()之后触发的第一个钩子,在当前阶段data、methods、com...
- 今年最常见的前端面试题,你会做几道?
-
在面试或招聘前端开发人员时,期望、现实和需求之间总是存在着巨大差距。面试其实是一个交流想法的地方,挑战人们的思考方式,并客观地分析给定的问题。可以通过面试了解人们如何做出决策,了解一个人对技术和解决问...
- 一周热门
- 最近发表
- 标签列表
-
- git pull (33)
- git fetch (35)
- mysql insert (35)
- mysql distinct (37)
- concat_ws (36)
- java continue (36)
- jenkins官网 (37)
- mysql 子查询 (37)
- python元组 (33)
- mybatis 分页 (35)
- vba split (37)
- redis watch (34)
- python list sort (37)
- nvarchar2 (34)
- mysql not null (36)
- hmset (35)
- python telnet (35)
- python readlines() 方法 (36)
- munmap (35)
- docker network create (35)
- redis 集合 (37)
- python sftp (37)
- setpriority (34)
- c语言 switch (34)
- git commit (34)
