当前位置: 首页 > 后端技术 > Java

Java将引入新的对象类型来解决内存利用问题

时间:2023-04-01 19:57:13 Java

Java在2022年会有哪些新特性和改进,相信很多Java开发者都想知道。结合Java语言架构师布赖恩·戈茨(BrianGoetz)近期的一些分享,胖哥为大家爆料。老规矩,竖起大拇指走。ValhallaBrianGoetz在去年年底发表了一篇名为StateofValhalla的文章,其中包含了很多信息。其中提到,早在2014年,Java项目组就启动了一个名为Valhalla的项目。该项目将为JVM平台带来更灵活、更扁平的数据类型。2021年,该项目将有进一步的动作。值对象、原始类和专门的泛型将很快被引入JVM平台。今天我们就来说说这个值对象是什么。我们知道什么是“值”,什么是“对象”,但什么是“值对象”呢?不仅你迷茫,我也迷茫,一起学习吧。Java类型系统的不足Java类型系统由10种内置类型组成。这10种类型不能直接表达复杂的数据结构,比如字符串、三维坐标、空间向量等,但是开发者可以使用这10种类型来表达对业务实体进行建模,Java的类型系统非常有用。但是Java类型仍然存在“缺陷”。同一类的两个对象包含完全相同的属性,但它们的内存寻址不同。所以从某种意义上说,他们有自己的身份。但它对于原始类型是不同的。如果一个int类型的变量的值为7,另一个为7,区分它们有意义吗?这个7还是那个7?显然毫无意义。再举一个现实中的例子。两件相同尺寸和材质的红色衣服一定是两件不同的衣服,但它们的材质必须是同一种材质,颜色必须是同一种颜色。傻子都不会认为这是两种颜色。这里的尺寸当然可以用Java中的原始类型来描述,但是材质和颜色不能(虽然颜色可以用十六进制表示),这里的尺寸、材质、颜色都应该算作原始类型。这个痛点促使了Valhalla项目的诞生。对象头为了理解Valhalla引入的ValueObject/Class和PrimitiveObject/Class概念能给我们带来什么,我们需要看看JVM是如何在内存中存储对象的。对象头对于类的对象非常重要,它决定了哪个线程可以访问该对象,垃圾收集器标记,对象哈希;更重要的是有对象的类型指针,可以在运行时动态访问对象的类,从它的类到对象的细节,比如继承多态,反射。但是任何事情都有两个方面。Java对象占用内存的大小取决于它包含的信息的总和。对象头在64位系统上至少需要16个字节,在32位系统上至少需要8个字节(当然JVM可以通过配置项设置如何保存对象头)。很多对象不需要多线程,也不需要对象识别,就像上面说的衣服的颜色,我们关心的只有颜色的值。这种冗余的内存使用让Java饱受诟病。值类对于很多对象来说,它的属性值的相等性才是我们关心的,其他的类信息是没有用的,而写的类只是为了存储值并对这些值进行操作占所有班级的比例非常大。Valhalla项目为此类场景引入了一种新的类类型:ValueClass。它仍然只是一个JEP草案,但已经初具规模:valueclassSubstringimplementsCharSequence{privateStringstr;私人int开始;私人意图结束;publicSubstring(Stringstr,intstart,intend){checkBounds(start,end,str.length());这个.str=str;this.start=开始;this.end=结束;}publicintlength(){返回结束-开始;}publiccharcharAt(inti){checkBounds(0,i,length());返回str.charAt(start+i);}publicSubstringsubSequence(ints,inte){checkBounds(s,e,length());返回新的子串(str,开始+s,开始+e);}publicStringtoString(){returnstr.substring(start,end);}privatestaticvoidcheckBounds(intstart,intend,intlength){if(start<0||end