Java Valhalla Project项目是什么

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;}

Java Valhalla Project项目是什么

另一方面,值类型Point的代码和相应的内存布局将是:

value class Point {  int x;  int y}

Java Valhalla Project项目是什么

这允许JVM将值类型展平为数组和对象,以及其他值类型。

在下图中,我们展示了在数组中使用Point类时间接的负面影响:

Java Valhalla Project项目是什么

另一方面,这里我们看到值类型Point[]的相应内存结构:

Java Valhalla Project项目是什么

它还使JVM能够在栈上传递值类型,而不必在堆上分配它们。最后,这意味着我们得到的数据聚合具有类似于Java原语的运行时行为,如intfloat

但与原语不同,值类型可以有方法和字段。我们还可以实现接口并将其用作泛型类型。

因此,我们可以从两个不同的角度来看值类型:

  • 更快的对象

  • 用户定义原语

作为额外的锦上添花,我们可以使用值类型作为泛型类型,而无需装箱。这直接将我们引向了另一个大型项目Valhalla的特性:专用泛型。

Specialized Generics 专用泛型

当我们想对语言原语进行泛化时,我们目前使用装箱类型,例如整数表示Integer或浮点表示Float。这种装箱创建了一个额外的间接层,从而首先破坏了使用原语提高性能的目的。

因此,我们在现有的框架和库中看到了许多针对基元类型的专门化,如IntStream<T>ToIntFunction<T>。这样做是为了保持使用原语的性能提高。

因此,专门化泛型是为了消除这些“黑客”的需求。相反,Java语言努力为基本上所有东西启用泛型类型:对象引用、原语、值类型,甚至可能是void

感谢各位的阅读,以上就是“Java Valhalla Project项目是什么”的内容了,经过本文的学习后,相信大家对Java Valhalla Project项目是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

文章标题:Java Valhalla Project项目是什么,发布者:亿速云,转载请注明出处:https://worktile.com/kb/p/23500

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022年9月8日 上午1:27
下一篇 2022年9月8日 上午1:28

相关推荐

  • Vue3项目中如何引入SVG图标

    SVG 图标 既然是页面,肯定离不开一些图标 icon ,所以肯定要去最全的 阿里图标库 来寻找 这里讲解下如何将 阿里图标库 里面的东西,放到我们的页面上 阿里图标库 进入页面,找到 资源管理 下面的 我的项目,并创建项目 设置如下 创建好项目后,我们进入到 阿里的 素材库 里面找一些后续需要的图…

    2022年8月31日
    26700
  • 计算机怎么完成信息处理任务

    计算机通过单条指令完成信息处理任务;计算机指令就是指挥机器工作的指示和命令,程序就是一系列按一定顺序排列的指令,执行程序的过程就是计算机的工作过程;信息处理是指获取信息并采用某种方法和设备,按一定的目的和步骤对原始信息进行加工,使之转变成可利用的有效信息过程。 本教程操作环境:windows10系统…

    2022年9月16日
    4700
  • vlookup函数条件怎么填写

    vlookup函数条件填写方法 1、第一个条件,选择需要查找的单元格,这里为“张三” 2、第二个条件,选中需要查找内容的列。 3、第三个条件,查看所需查找内容在第几列,这里工资在第三列,所以填“3” 4、第四个条件,如果要查找精确数据,就选择“0”,要模糊查找就用“1” 5、最后按下回车,就可以输出…

    2022年9月22日
    7100
  • cad块如何创建

    cad块创建方法: 1、首先打开CAD图纸,然后去绘制一个方格图形。 2、然后在命令栏中输入图块命令“B”按下空格键。 3、然后去选择你要创建的图形,编辑名称后点击确定即可创建。 4、最后只要双击你的鼠标,就可以看到属性了,即可成功创建块。 到此,关于“cad块如何创建”的学习就结束了,希望能够解决…

    2022年8月30日
    3900
  • JavaScript单线程和任务队列是什么

    本文章是对以往“JavaScript单线程和任务队列是什么”知识点的总结与梳理,不仅内容丰富、详细,而且知识点逻辑十分清晰。相信多数人读完本文后,会对“JavaScript单线程和任务队列是什么”的知识内容,有更为深入的理解和认识。 一、JavaScript为什么设计为单线程? JavaScript…

    2022年6月27日
    7100
  • MySQL日志管理怎么配置

    MySQL的日志默认保存在数据库文件的存储目录(一般为/usr/local/mysql/data/)。也可以修改配置文件,自定义日志文件的保存位置。 我这里在编译安装时,数据库文件存储目录设置的是/home/mysql。 一、四种日志介绍 1.1 错误日志 错误日志,用来记录当MySQL启动、停止或…

    2022年9月21日
    5700
  • windows如何修改一张图片的分辨率

    修改方法 1、打开图片,右击选择属性。可以从属性详细信息中查看到这个图片的分辨率。当前这个图片分辨率为687*379。 2、右击图片,选择编辑。打开图片编辑界面。也可以直接打开画图软件,在画图软件中打开需要编辑的这张图片。 3、选择工具栏中的重新调整大小选项。点击打开,会出现如图所示界面,通过这两个…

    2022年9月21日
    7200
  • tencent files可不可以删除

    “tencent files”可以删除,但是不建议删除;“tencent files”文件是腾讯文件,其中储存的都是与腾讯软件有关的文件,例如QQ中的缓存文件,如果删除该文件,可能会导致腾讯的软件在使用的过程中出现异常。 本教程操作环境:windows10系统、DELL G3电脑。 tencent …

    2022年9月18日
    9500
  • Python如何多线程并发下载图片

    最终效果 这就是我们最终要构建的效果。 安装依赖项 让我们安装每个人最喜欢的 requests 库。 pip install requests 现在,我们将看到一些用于下载单个 URL 并尝试自动查找图像名称以及如何使用重试的基本代码。 import requestsres = requests.g…

    2022年9月22日
    8400
  • config文件有什么作用

    config文件是软件或者系统中配置文件的意思;该文件中包含了设置和配置信息以及不同的程序可以以不同的格式存储这些数据,并且不建议删除该文件,因为该文件在用户开机这段时间对计算机进行初始化设置,也就是用户对系统的设置都由该文件来对计算机进行恢复。 本教程操作环境:windows10系统、DELL G…

    2022年9月15日
    30700
联系我们
关注微信
关注微信
分享本页
返回顶部
PingCode 比 Jira 更好用的研发管理工具。免费试用