写点什么

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

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

关注

评论

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

IntelliJ IDEA Ultimate 配置 PHP 拦截器中 Xdebug 扩展应该怎么填

HoneyMoose

基于CC2530设计的自动晾衣杆

DS小龙哥

2月月更

数据平台与Flink任务运行原理介绍

云智慧AIOps社区

redis 云计算 大数据 kafka Flink 平台

灵雀云加入,龙蜥社区迎来国内领先的企业级PaaS服务商

OpenAnolis小助手

Linux 开源 云原生 PaaS

ShardingSphere 助力当当 WMS:订单效率提升 30%、节约成本上千万

SphereEx

数据库 开源 ShardingSphere wms SphereEx

学生管理系统详细架构设计文档

晨亮

「架构实战营」

如果写作平台不叫写作平台,他应该叫……?

InfoQ写作社区官方

写作平台 创意 话题讨论 热门活动

绿色数据中心“东数西算”全面启动!八大枢纽十大集群 - 涉及高性能计算,数据集群,水冷散热

GPU算力

重新理解“无容灾不上云”:应用多活将成为云原生容灾新趋势

阿里巴巴云原生

阿里云 开源 云原生

IntelliJ IDEA 在校验 PHP Debug 配置的时候提示 Xdebug 扩展没有载入

HoneyMoose

外包学生管理系统架构设计文档

五月雨

架构实战营 「架构实战营」

尚硅谷MyBatis新版视频教程发布

@零度

Java mybatis

web前端开发nodejs基本原理_前端培训

@零度

node.js 前端开发

亚信科技AntDB数据库参与“国内首款”事务型性能测试工具开源发布会,树立金融技术风向标

亚信AntDB数据库

AntDB 性能基准测试 中国信通院

阿里巴巴的Java开发手册(黄山版)来了

Geek_rze78a

Java 阿里巴巴面经总结

架构学习【03】——外包学生管理系统的架构文档

tiger

架构实战营

IntelliJ IDEA 在校验 PHP Debug 配置的时候提示 URL 无法访问

HoneyMoose

你才二十几岁呀,怎么眼里没有光了呢?

架构精进之路

随笔 日常感悟 2月日更

uni-app技术分享| uni-app常见问题(一)

anyRTC开发者

uni-app 音视频 WebRTC 移动开发 实时通讯

java面试jvm调优的意义_java培训

@零度

JVM JAVA开发

IntelliJ IDEA Ultimate 配置 PHP 拦截器

HoneyMoose

RocketMQ-Streams 首个版本发布,轻量级计算的新选择

阿里巴巴云原生

安全领域权限模型

alibeer

前后端分离项目,如何解决跨域问题?

沉默王二

Java 前端 后端 跨域

一句话告诉您什么是运维?以及如何运维才能事半功倍?

行云管家

运维 IT运维 自动化运维

linux服务器是什么?如何快捷安全管理?

行云管家

运维 服务器

Khronos 会议干货 | WebGPU 1.0 即将发布

Orillusion

开源 WebGL 元宇宙 Metaverse webgpu

大数据开发join的运行原理_大数据培训

@零度

hive 大数据开发

开发运维效率提升 80%,计算成本下降 50%,分众传媒的 Serverless 实践

阿里巴巴云原生

阿里云 Serverless 云原生 合作案例

外包学生管理系统架构设计文档

风中奇缘

架构实战课 「架构实战营」

如何在 Vue 中导出数据至 Excel 表格 - 卡拉云

蒋川

Vue Vue 3 vue admin

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