网站首页 > 精选教程 正文
- Valhalla项目的动机和原因
在本文中,我们将介绍Valhalla项目——它的历史原因、当前的开发状态,以及它发布后为日常Java开发人员带来了什么。
Valhalla项目的动机和原因
Oracle的Java语言架构师Brian Goetz在一次演讲中说,Valhalla项目的主要动机之一是希望使Java语言和运行时适应现代硬件。当Java语言诞生时(大约25年前撰写本文时),获取内存和算术运算的成本大致相同。
如今,这种情况已经发生了变化,内存提取操作的成本是算术操作的200到1000倍。就语言设计而言,这意味着导致指针提取的间接操作会对整体性能产生不利影响。
由于应用程序中的大多数Java数据结构都是对象,因此我们可以将Java视为 指针密集型语言(尽管我们通常不会直接看到或操作它们)。这种基于指针的对象实现用于启用对象标识,对象标识本身用于语言特性,如多态性、可变性和锁定。默认情况下,这些特性适用于每个对象,无论它们是否真的需要。
遵循导致指针的标识链和导致间接的指针链,间接存在性能缺陷,逻辑上的结论是删除那些不需要它们的数据结构。这就是值类型value types发挥作用的地方。
value types值类型
值类型的概念是表示纯数据聚合。这会删除常规对象的功能。因此,我们有纯数据,没有身份。当然,这意味着我们也失去了使用对象标识可以实现的功能。因此,平等比较只能基于状态进行。因此,我们不能使用表示多态性,也不能使用不可变或不可为空的对象。
由于我们不再有对象标识,我们可以放弃指针,改变值类型的一般内存布局,而不是对象。让我们来比较一下类点和相应的值类型点之间的内存布局。
常规Point类的代码和相应的内存布局为:
final class Point {
final int x;
final int y;
}
另一方面,值类型Point的代码和相应的内存布局将是:
value class Point {
int x;
int y
}
这允许JVM将值类型展平为数组和对象,以及其他值类型。在下图中,我们展示了在数组中使用Point类时间接的负面影响:
另一方面,这里我们看到值类型 Point[] 的相应内存结构:
它还使JVM能够在栈上传递值类型,而不必在堆上分配它们。最后,这意味着我们得到的数据聚合具有类似于Java原语的运行时行为,如 int 或 float 。
但与原语不同,值类型可以有方法和字段。我们还可以实现接口并将其用作泛型类型。因此,我们可以从两个不同的角度来看值类型:
- 更快的对象
- 用户定义原语
作为额外的锦上添花,我们可以使用值类型作为泛型类型,而 无需装箱 。这直接将我们引向了另一个大型项目Valhalla的特性:专用泛型。
Specialized Generics 专用泛型
当我们想对语言原语进行泛化时,我们目前使用装箱类型,例如整数表示 Integer 或浮点表示 Float 。这种装箱创建了一个额外的间接层,从而首先破坏了使用原语提高性能的目的。
因此,我们在现有的框架和库中看到了许多针对基元类型的专门化,如 IntStream<T> 或 ToIntFunction<T> 。这样做是为了保持使用原语的性能提高。
因此,专门化泛型是为了消除这些“黑客”的需求。相反,Java语言努力为基本上所有东西启用泛型类型:对象引用、原语、值类型,甚至可能是 void 。
结论
我们初步了解了Valhalla项目将给Java语言带来的变化。其中两个主要目标是提高性能和减少泄漏的抽象。
性能增强通过展平对象图和移除间接来解决。这将导致更高效的内存布局和更少的分配和垃圾回收。
当用作泛型类型时,原语和对象具有更相似的行为,这是更好的抽象。
猜你喜欢
- 2025-04-08 用友NC系统“登陆后页面显示不完全”,怎么办?
- 2025-04-08 WINDOWS 中的 APPDATA 文件夹是什么以及如何清理它
- 2025-04-08 Linux基础知识 | 文件与目录大全讲解
- 2025-04-08 I/O流之File类的用法和实例详解——Java进阶知识讲义系列(八)
- 2025-04-08 Java文件的读写操作方法(java对文件的读写)
- 2025-04-08 Java 中文件目录监听实现(java监听ftp目录)
- 2025-04-08 怎么还有人不知道?微信的WeChat Files文件夹能不能删除?
- 2025-04-08 linux chmod命令设置目录/文件权限详解
- 2025-04-08 Java中将数组对象中的某个字段的值清空
- 2025-04-08 一个Tomcat 如何部署多个项目?附多种解决方案及详细步骤
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)