写点什么

Oracle 优化 Java 字符串内部表示

  • 2013-12-24
  • 本文字数:688 字

    阅读完需:约 2 分钟

为了不断改善 Java 性能,Oracle 已经宣布自 Java 1.7.0_06 开始更改 String 类中的字符串内部表示。

此次更改删除了 String 底层实现中的两个非静态字段,这样做有助于防止内存泄漏。

原来的 String 实现基于四个非静态字段。第一个是 char[] 值,它包含组成 String 的字符。第二个是 int offset,它保存值数组中第一个字符的索引。第三个是 int count,它保存用到的字符数。第四个是 int hash,它保存 String 哈希码的缓存值。

Oracle 报告称,当调用 String.substring()创建 String 时,原来的实现会产生性能问题。许多其它 API,如 Pattern.split(),都会在内部调用 substring()。当 String.substring()被调用时,它会引用原来的包含组成 String 的字符的内部 char[]。

原先的实现之所以采用这种设计方式是为了节省内存,因为子串仍然会引用原来的字符数据。除此之外,String.substring()的运行时间是一个常量(O(1)),而不像新的实现那样,有一个线性(O(n))运行时间。

不过,如果应用程序从原来的长字符串中抽取一个短字符串,并随后丢弃原来的字符串,那么在这种情况下可能会产生内存泄漏。在这个场景中,仍然存在一个活引用,指向原来字符串底层那个原来较大的 char[] 值,这可能会占据许多不再使用的数据字节。

在早期版本中,Oracle 建议在短字符串上调用 new String(String)构造函数来避免这种情况。那个 API 只复制所需的底层 char[] 的一部分,从而解除新的较短的字符串与原来的较长的父字符串的关联。

新规范删除了 String 的 offset 和 count 字段,因此子串不再共享底层的 char[] 值。

查看英文原文: Oracle Tunes Java’s Internal String Representation

2013-12-24 06:063356
用户头像

发布了 256 篇内容, 共 97.1 次阅读, 收获喜欢 12 次。

关注

评论

发布
暂无评论
发现更多内容

3分钟快速掌握Go语言正/反向代理的姿势

有态度的马甲

【炫丽】从0开始做一个WPF+Blazor对话小程序

沙漠尽头的狼

从输入URL到渲染的完整过程

loveX001

JavaScript

从异步讲起,『函数』和『时间』该作何关系?

掘金安东尼

前端 11月月更

Java中的递归详解

共饮一杯无

Java 递归 11月月更

线上 hive on spark 作业执行超时问题排查案例分享

明哥的IT随笔

hadoop spark hive

鸿蒙开发实例 | 分布式涂鸦

TiAmo

华为 鸿蒙 云开发 11月月更

发力新市民圈层,银行系消费金融这半年都有哪些行动?

易观分析

金融 银行

数据湖(二十):Flink兼容Iceberg目前不足和Iceberg与Hudi对比

Lansonli

数据湖 11月月更

从输入URL到渲染的过程中到底发生了什么?

loveX001

JavaScript

前端面试中小型公司都考些什么

loveX001

JavaScript

前端打工人的面试总结

loveX001

JavaScript

一天梳理完React所有面试考察知识点

beifeng1996

React

极客时间运维进阶训练营第一周作业

LiaoWD

dokcer

随机森林-机器学习中调参的基本思想

烧灯续昼2002

Python 机器学习 算法 随机森林 11月月更

有赞算SaaS平台吗?

产品海豚湾

产品经理 SaaS 产品运营 B端产品 11月月更

React源码分析8-状态更新的优先级机制

goClient1992

React

深入理解Metrics(一):Gauges

冰心的小屋

Java metrics Guages

Java中的泛型详解

共饮一杯无

Java 泛型 11月月更

Java中的Iterator迭代器详解

共饮一杯无

Java 迭代器 11月月更

如何做好线上服务质量保障?

老张

软件测试 质量保障

一道React面试题把我整懵了

beifeng1996

React

Cox 比例风险回归模型

heart_6662

11月月更 cox 生存分析 生物信息学

计算机网络:随机访问介质访问控制之ALOHA协议

timerring

计算机网络 11月月更 ALOHA

从React源码分析看useEffect

goClient1992

React

AJAX的作用和使用

格斗家不爱在外太空沉思

JavaScript ajax 11月月更

算法题学习---链表中的节点每k个一组

桑榆

算法题 11月月更

docker-compose下的java应用启动顺序两部曲之二:实战

程序员欣宸

Docker Docker-compose 11月月更

前端工程师的20道react面试题自检

beifeng1996

React

你需要的react面试高频考察点总结

beifeng1996

React

React源码分析8-状态更新的优先级机制

goClient1992

React

Oracle优化Java字符串内部表示_Java_Kaushik Pal_InfoQ精选文章