写点什么

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

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

关注

评论

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

NumPy之:NumPy简介教程

程序那些事

Python 数据分析 Python3 Numpy 程序那些事

使用 SpringBoot 的 CommandLineRunner 遇到的坑

Java小咖秀

容器 开发 springboot CommandLineRunner ApplicationRunner

为什么 Serverless 将推动边缘计算的革命

公众号:云原生Serverless

Serverless 边缘计算

专访声网首席资深iOS研发工程师龚宇华:从自学计算机到高级架构师

程序员潘Sir

专访

专访吴翰清 || 如何用网络安全保障个人隐私

Bob

网络安全 个人隐私 调查采访能力考核

区块链电子证据的司法应用现状与展望

CECBC

ES 终于可以搜到“悟空哥”了!

悟空聊架构

中文分词 elasticsearch 分词 ES ik

【Knative系列】看完这篇还不懂 Knative Serving,你来打我~(史上最详细)

公众号:云原生Serverless

Serverless 云原生 Knative

炫彩无界,性能怪兽,M1 扛鼎未来 —— 2021 年 Apple 春季新品发布会全记录

清秋

产品 苹果 硬件 新闻

应用区块链技术打通各自为战形成的壁垒

CECBC

Zookeeper基础原理&应用场景详解

leonsh

zookeeper 中间件 ZooKeeper原理

Semaphore自白:限流器用我就对了!

王磊

Java 多线程 Semaphore

Ansible 配置

耳东@Erdong

4月日更

【LeetCode】解码方法Java题解

Albert

算法 LeetCode 4月日更

别再问我 2050 可以干什么,Make a Movie in a Day!

阿里云CloudImagine

电影

实体经济与数字经济加速融合 中国经济新动能快速成长

CECBC

数字经济

存储成本降低80%!US3在海量数据归档存储下的成本优化技术实践

UCloud技术

存储 海量数据 存储成本

Golang 并发

escray

学习 极客时间 Go 语言 4月日更

没有自信的人,才会在意别人的评价

小天同学

心理 日常思考 个人感悟 4月日更 自信

“湘”遇区块链 赋能新业态

CECBC

哭了!“日志注入”为什么跟想象中的不一样

华为云开发者联盟

Java 参数 日志注入 log4j2框架 异常堆栈

张超 - 机锋网联合创始人 - 采访提纲:那些 3 个月就上线的产品,如何去做技术规划?

梦想橡皮擦

签约计划

《专访彩食鲜CTO乔新亮:体系的重要性》(采访提纲)

花花

调查采访能力考核

浅谈Javascript中的forEach和map之间的区别

devpoint

遍历 foreach map reduce

架构实战营 模块2作业

CR

聪明人的训练(二十一)

Changing Lin

4月日更

读《乌克兰拖拉机简史》有感

箭上有毒

读书笔记 4月日更

禁止算法识别性别,能消解歧视吗?

脑极体

分库分表笔记

luojiahu

分库分表

白皮书:区块链将成隐私计算产品必选项,提供三方面助力

CECBC

区块链

网络安全传奇吴翰清采访提纲 |调查采访能力考核

清秋

网络安全 签约计划 调查采访能力考核

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