【ArchSummit架构师峰会】探讨数据与人工智能相互驱动的关系>>> 了解详情
写点什么

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:062898
用户头像

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

关注

评论

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

报销发票抵扣工资的CTO,该不该? | 法庭上的CTO(5)

赵新龙

CTO 法庭上的CTO

S型曲线不止关乎身材?|技术人应知的创新思维模型(2)

Alan

创新 思维模型

第六周-学习总结

Mr_No爱学习

生产环境压测建设历程之三 淘宝网2009年的痛

数列科技杨德华

「生产事故」MongoDB复合索引引发的灾难

Kerwin

数据库 mongodb

话题讨论 | 作为地地道道的程序员半年内都没摸过代码是什么样的体验?

xcbeyond

话题讨论

基于有限状态机与消息队列的三方支付系统补单实践

Java架构师迁哥

Bitmap为什么那么快?

Man

redis 中间件

第六周-作业1

Mr_No爱学习

警察营救安徽望江县17岁女生跳河自尽过程中,现场看热闹的旁观者们在做什么?

wbliu85

读写分离这个坑,你应该踩过吧?

楼下小黑哥

MySQL 主从同步 读写分离

谷燕西:不需要银行的银行业务

CECBC

移动互联网

《Python深度学习》第二版重磅来袭——(Keras之父亲自编写)

计算机与AI

Redis 子进程开销监控和优化方式

码农架构

Redis开发与运维

第十一周作业

solike

架构词典:语言

lidaobing

架构 语言

Spock单元测试框架实战指南四 - 异常测试

Java老k

Java 单元测试 spock

数字经济跨越五个融合发展阶段,区块链正成为基础支撑结构

CECBC

数字经济

Windows下MySQL无法启动万能解决方案

MySQL从删库到跑路

MySQL

甲方日常 64

句子

工作 随笔杂谈 日常

5种分布式事务方案与阿里的 Seata 中间件

Bruce Duan

分布式事务 seata

国家计算机网络与信息安全管理中心官员:数字货币的风险仍需关注

CECBC

信息安全

Newbe.ObjectVisitor 0.4.4 发布,模型验证器上线

newbe36524

.net core ASP.NET Core dotnet

算法训练营课程纲要

陈皓07

Redis 持久化方式-RDB

码农架构

redis redis持久化

《前端算法系列》数组去重

徐小夕

Java 面试 算法 大前端

2. Spring早期类型转换,基于PropertyEditor实现

YourBatman

Spring Framework 类型转换 PropertyEditor

百篇已过,又是一个新篇章,谈谈感受吧

良知犹存

代码人生

拆解增长黑客之实战(二):留存与变现

懒杨杨

读书 增长 产品运营

面试被问线程安全怎么保障,我的回答让面试官眼前一亮

996小迁

Java 架构 面试 多线程

排查指南 | 当 mPaaS 小程序提示“应用更新错误(1001)”时

蚂蚁集团移动开发平台 mPaaS

小程序 问题排查 mPaaS

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