热门搜索: 小说 摆渡人 精彩

Java 9 内部——性能、编译器等等

[复制链接]
发表于 2024-2-14 13:38:31 | 显示全部楼层 |阅读模式
114 0
除了模块化之外,Java 9 还提供了很多功能:新的语言功能和许多新的或改进的 API、GNU 风格的命令选项、多版本 JAR、改进的日志记录等等。让我们探索这个“更多”并看看性能的改进,这在很大程度上要归功于字符串欺骗、编译器、垃圾收集和 JavaDoc。 目录 性能改进 紧凑弦乐 执行 表现 指定字符串连接 另一个混合包 垃圾收集 编译器 编译较旧的 Java 版本 JVM 编译器接口 提前编译 内部结构 Java文档 不再! 评论 性能改进 Java 的性能在各个版本中都变得越来越高,9 也不例外。有一些有趣的变化旨在减少 CPU 周期或节省内存。 紧凑弦乐 当您查看 Java 应用程序的堆并删除我们用来组织状态的所有对象头和指针时,只保留原始数据。它由什么组成?当然是原语——很多很多都是chars,集中在char支持String实例的数组中。

事实证明,这些数组占据了普通应用程序实时数据(包括标头和指针)的 20% 到 30% 之间。这方面的任何改进对于大部分 Java 程序来说都是一个巨大的胜利!事实上,还有改进的空间。 Achar占用两个字节,因为它代表完整的 UTF-16 代码单元,但事实证明,绝大多数字符 华人海外澳洲号码数据 串只需要 ISO-8859-1,即单个字节。这是巨大的!使用尽可能仅使用单个字节的新表示形式,由字符串引起的内存占用几乎可以减少一半。这将使普通应用程序的内存消耗减少 10% 到 15%,并且还可以通过花费更少的时间收集垃圾来减少运行时间。 当然,只有在没有开销的情况下这才是正确的。免费午餐有人吗?JEP 254尝试了一下…… 执行 在 Java 8 中,String有一个字段char[] value——这就是我们刚才讨论的数组,它保存字符串的字符。



这个想法是使用byte数组来代替,并根据所需的编码为每个字符花费一个或两个字节。 这听起来像是 UTF-8 等可变大小记录的情况,其中每个字符区分一个字节和两个字节。但是这样就无法预测单个字符它将占用哪个数组槽,因此需要随机访问(例如charAt(int))来执行线性扫描。将随机访问性能从恒定时间降低到线性时间是不可接受的回归。 相反,每个字符都可以用单个字节进行编码,在这种情况下,这是所选的表示形式,或者如果其中至少一个字符需要两个,则两个字节将用于所有字符。一个新字段coder将表示字节如何编码字符以及String评估它以选择正确的代码路径的许多方法。 当在 Java 8 中构造新字符串时,char通常会重新创建数组,然后从构造函数参数中填充该数组。例如,当new String(myChars)被调用时,Arrays.copyOf用于分配myCharsto的副本value。这样做是为了防止与用户代码共享数组,并且只有少数情况下不会复制数组,例如从另一个字符串创建字符串时。

回复

使用道具 举报

高级模式
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝0

帖子10

发新帖子

精彩资讯

阅读排行

优秀作品