Q:JDK6中的substring()方法容易导致内存泄露而JDK7不会出现这样的情况的原因

Java字符串转数组的五种方案与split()底层陷阱解析 字符串转数组是Java基础操作,本质涉及String不可变性、正则引擎匹配、数组内存分配等核心机制。其原理不仅限于API调用,更关联JVM对Pattern编译、Matcher执行及空字符串语义的处理逻辑。技术价值在于保障日志解析、配置加载、协议解包等关键链路的数据完整性与性能稳定性。典型应用场景包括CSV字段切分、URL参数提取、SKU属性解析等高可靠性要求的系统模块。深入理解split()的limit参数行为、正则转义规则及Guava/Splitter等替代方案,是规避线上空值丢失、OOM和安全风险的关键 阅读详情

@文章来源:https://www.programcreek.com/2013/09/the-substring-method-in-jdk-6-and-jdk-7/

JDK6和JDK7中提供的substring(int beginIndex,int endIndex)方法的实现是不同的。这篇文章用来讲解其不同之处。为了简单起见,在这文章中,substring()方法代表了substring(int beginIndex,int endIndex)方法。

 

1.substring方法的作用

substring(int beginIndex,int endIndex)方法返回一个字符串从beginIndex开始到endIndex-1结束的子字符串

String x=”abcdef”;

x=x.substring(1,3);

System.out.println(x);

 

运行结果:

bc

 

 

2.substring()方法内部执行的细节

你可能会知道,因为变量x为不可变的对象,当x被x.substring(1,3)重新赋值的时候,其会指向堆内存中的一个新的字符串对象,就像如下图一般:

 



然而,这张图表示的并不完全正确。正确的是,在JDK6和JDK7中substring()方法的实现是不同的。

 

3.substring()方法在JDK6中的实现

字符串对象的实现是一个字符数组。在JDK6中,String类包含了3个成员变量:char[] value,int offset,int count。他们分别被用来存储真实的字符数组,字符串在字符数组中的第一个字符的索引,字符串中字符的数目。

当substring()方法被调用的时候,其会新创建一个String对象并返回,但是其新创建的String对象的字符数组value的指针仍指向原String对象的value数组的对象。两个String对象的不同之处仅在于成员变量count和offset的值。

 

 


 

如下代码仅包含解释该问题的关键部分

//JDK6

String(int offset,int count,char[] value)

{

this.value=value;

this.offset=offset;

this.count=count;

}

public String substring(int beginIndex,int endIndex)

{

return new String(offset+beginIndex,endIndex-beginIndex,value);
}

 

4.在JDK6中substring()方法存在的问题

如果你有一个非常长的字符串,但你每次使用substring()方法去提取你所需的那很小的一部分字符串,由于你每次仅需要很少的一部分字符串,由于其在堆内存中保存下了一整个数组,为此其会出现性能上的问题(内存泄露)。对于JDK6,解决这个问题的方法是使用如下的方式去提取子串,其会返回一个真正的子串对象:

x=x.substring(beginIndex,endIndex)+””;

/*

*以上代码的实现等价于x=(new StringBuilder()).append(x.substring(1, 3)).append("").toString();

*

*其原因可以参见StringBuilder中对于字符串中append方法的实现,由于在append方法中

*调用了System.arraycopy()方法,为此,其会返回一个真正的字符串

*

*/

5.substring()方法在JDK7中的实现

在JDK7中,substring()方法进行了改进,在JDK7中substring()方法会在堆内存中创建一个真正的(字符)数组




//JDK7

public String(char[] value,int offset,int count)

{

this.value=Arrays.copyOfRange(value,offset,offset+count);

}

public String substring(int beginIndex,int endIndex)

{

int subLen=endIndex-beginIndex;

return new String(value,beginIndex,subLen);

}



Java面试深度追问逻辑:从HashMap到JVM的三层穿透 HashMap底层实现原理与JVM内存模型是Java工程师的核心基础概念,其本质是理解数据结构在内存中的组织方式与运行时行为约束。原理层面涉及哈希算法设计、数组扩容机制、红黑树转换条件及内存可见性保障;技术价值体现在高并发场景下的线程安全边界、GC行为可预测性与故障定位效率;典型应用场景覆盖电商库存扣减、订单对账、微服务启动优化等生产环境。本文基于真实面试切片,聚焦HashMap链表转红黑树阈值、JVM元空间迁移、volatile内存屏障等高频热词,还原从知识复述到机制推演再到业务归因的能力跃迁路径。 阅读详情

相关推荐

2026 Java面试本质:从八股文到系统性工程能力跃迁

Java面试已不再是语法记忆与API复述,而是对JVM运行时机制、Spring平台级抽象、分布式系统协同等底层原理的综合考察。其核心在于理解Java内存模型(JMM)与JVM内存结构的本质差异,掌握Spring Boot自动装配中@Import与DeferredImportSelector的协作逻辑,并能基于真实生产问题(如OOM根因、ThreadLocal泄漏、MySQL死锁链)开展跨栈诊断。技术价值体现在将单点知识转化为可权衡的架构决策能力,典型应用场景包括高并发订单一致性分析、响应式栈迁移评估、JDK

adr5970的博客 423

Java String.split()底层原理与高并发实战避坑指南

字符串分割是Java开发中最基础的文本处理操作,其核心依赖于正则匹配与字面量快速路径的双模式引擎机制。理解split()如何基于Pattern编译、limit参数对空字符串的截断逻辑,以及JVM中String的LATIN1/UTF-16存储差异,是保障系统稳定性的关键。该机制直接影响CSV解析、HTTP头处理、日志结构化等高频场景的正确性与性能。尤其在支付网关、风控引擎等高并发系统中,不当使用split()易引发数据错位、GC飙升与正则回溯等线上故障。本文结合OpenJDK 17源码与JMH实测,深入剖析s

aebe49167的博客 543

保姆级教程:在Windows 11上为Qt Creator 5.12.9配置Android开发环境(含OpenSSL配置)

本文提供Windows 11系统下为Qt Creator 5.12.9配置Android开发环境的详细指南,涵盖Android Studio安装、Qt Creator工具链集成、OpenSSL配置等关键步骤。特别针对跨平台开发需求,解析多ABI构建、原生代码交互等高级技巧,帮助开发者高效搭建稳定的Android开发环境。

weixin_30412167的博客 485

千万不要在生产环境使用这个版本的JDK,这不?内存又溢出了!快要裂开了!(建议收藏)

这个版本的JDK中String的substring()方法在高并发大流量的场景下,会频繁引发内存溢出,冰河亲身经历,强烈建议大家收藏!!

冰河的专栏 5622

ComfyUI面部修复FaceDetailer保姆级教程:从模型选择到参数调优全解析

本文提供ComfyUI面部修复FaceDetailer的保姆级教程,深度解析从模型选择到参数调优的全过程。针对常见的五官模糊、肤色不均等问题,详细对比了BBox与Segm检测器的优劣,并给出SD1.5与SDXL模型的核心参数联动策略与实战方案,帮助用户精准掌控AI绘画中的面部修复效果。

weixin_29073241的博客 472

【翼型】基于Matlab的NACA翼型气动性能仿真与优化【附源码】

本文详细介绍了如何使用Matlab进行NACA翼型的气动性能仿真与优化。内容涵盖从生成NACA翼型坐标、利用面板法快速估算升阻力,到进阶的粘性流模拟与优化设计入门。通过清晰的代码示例和分步指南,帮助读者掌握基于Matlab的翼型分析与优化流程,为飞行器或叶片设计提供实用工具和方法。

weixin_29032489的博客 412

Java内存泄漏-------JDK6与JDK7里的subString()方法

在JVM中一般在GC时可达性分析算法,而有些java对象存在着“可达而不可用”,这也就导致java内存泄漏。何为“可达而不可用”呢?简单来说也就是一个对象生命周期已经结束,但是他被别的对象引用了,而那个对象生命周期还未结束,所以也就出现了内存泄漏。举个例子,对象A引用了对象B,对象A的生命周期比对象B长,当对象B生命周期结束时,对象A还未结束并且保持着对对象B的引用。对象B无法被GC,也就导致了内...

CCC的博客 413

DIC新手避坑指南:压缩实验中的应变测量常见错误与数据校验技巧

本文为DIC技术新手提供了压缩实验中应变测量的全面避坑指南。文章系统梳理了从试样尺寸录入、散斑质量到数据后处理中应变方向与符号混淆、数据插值对齐等常见错误,并分享了基于MATLAB的自动化数据校验与可视化对比技巧,帮助建立可靠的实验数据分析SOP,确保DIC测量结果的准确性。

weixin_29313423的博客 115

内存泄露之--JDK6里的subString()方法

在Java中我们无须关心内存的释放,JVM提供了内存管理机制,有垃圾回收器帮助回收不需要的对象。但实际中一些不当的使用仍然会导致一系列的内存问题,常见的就是内存泄漏和内存溢出 内存溢出(out of memory ) :通俗的说就是内存不够用了,比如在一个无限循环中不断创建一个大的对象,很快就会引发内存溢出。 内存泄漏(leak of memory) :是指为一个对象分配内存之后,在对

南朝烟雨的博客 2412

基于 ESP32 的智能药盒提醒装置设计与实现

本装置基于 ESP32 实现了智能药盒的核心功能,硬件选型兼顾成本与实用性,软件设计模块化、易拓展。后续可通过 ESP32 的 WiFi 模块接入物联网平台(如阿里云、OneNet),实现远程设置提醒、服药状态反馈等功能,进一步提升智能化水平。该装置能有效解决老人忘服药问题,具有较高的实用价值与推广潜力。

weixin_42300449的博客 1045

AI产品经理面试宝典第94天:RAG知识库构建与预处理策略面试指南

本文深入解析RAG知识库构建的核心挑战与预处理策略,涵盖文档格式转换、问答对生成及自动化测试全流程,为AI产品经理提供面试必备的实战方法论与避坑指南,助你精准应对技术深度类问题。

打造全国最全的AI Agent开发知识领域的博客 312

为什么JDK6中的substring()方法会导致内存泄露?

JDK6中subString()的源码 01 //JDK6 02 String(intoffset,intcount,charvalue[]){ 03 this.value=value; 04 this.offset=offset; 05 this.count=count; 06 } ...

各研发管理 211

网络工程师如何利用Python自动Telnet到N个路由器并执行配置?

telnetlib是Python标准库中的一个模块,专门用于实现Telnet协议。通过telnetlib,我们可以方便地与支持Telnet协议的远程设备进行通信。telnetlib提供了基本的Telnet功能,如连接远程主机、发送命令、读取响应等,使得编写Telnet自动化脚本变得非常简单。文档:可以选择中文:虽然telnetlib的功能相对基础,但对于大多数Telnet操作来说已经足够。通过telnetlib,可以轻松地实现与网络设备的交互,完成自动化配置任务。

网络技术联盟站 298

Java substring方法与内存溢出

说明:本文是阅读《Java程序性能优化》(作者:葛一明)一书中关于substring方法内存溢出一节的笔记。 一、String对象及其特点 1、在C语言中对字符串的处理通常是采用char数组,但是对于数组本身来说,它无法封装字符串操作的一些基本方法,所以在Java中,String对象可以看成是char数组的一种封装。Java中数组的基本实现如下图,主要由char数组、偏移量和Strin

漂流在深圳 3659

把 SAP GUI 做成可维护的应用:Module Pool 基础与 Table Control 深入实战

SAP Module Pool 与 Table Control 开发要点 摘要:Module Pool 作为 SAP GUI 交互的核心技术,由程序、屏幕(Dynpro)和流逻辑(Flow Logic)组成,通过 PBO/PAI 事件驱动数据流。Table Control 是其中处理多行数据的核心控件,其开发关键在于: 正确理解 PBO/PAI 数据流机制 掌握 CXTAB_CONTROL 结构的关键属性(LINES、TOP_LINE 等) 合理设置列控制属性(CXTAB_COLUMN) 采用 LOOP W

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 246

MicroCap声学仿真介绍(六)-入耳式耳机仿真

从上图可以看出,后腔开了泄声孔后,振膜的最大位移从4.8um提升到了10um,振膜位移增加了一倍。在实际应用中,一般耳机的前腔和后腔都需要开泄声孔,开孔的大小和调音网布的阻尼需要根据客户的要求以及仿真的结果进行权衡选择。接着在主界面放置电阻、电感、电容,电阻值为Rms,电感值为Mms,电容值为Cms,如下图。假设后腔泄声孔的直径为1.2mm,宽度为0.3mm,对应调音网的阻抗为5.5e8欧姆。假设前腔泄声孔的直径为1.2mm,宽度为0.3mm,对应调音网的阻抗为5.5e8欧姆。

山无忧的博客 1802

注意:字符串substring方法在jkd6,7,8中的差异

标题中的substring方法指的是字符串的substring(int beginIndex, int endIndex)方法,这个方法在jdk6,7是有差异的。 substring有什么用? substring返回的是字符串索引位置beginIndex开始,endIndex-1结束的字符串。 来看这个例子: String x = "abcdef"; x = x.substring(1,3); System.out.println(x); 输出: bc 下面看看在JDK之间,它们的实现原理有什么不一

CRMEB小程序商城的博客 325

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

java.lang.String内部结构的变化

原文:http://java-performance.info/changes-to-string-java-1-7-0_06/ 作者:Mikhail Vorontsov IMPORTANT: Java 7 update 17 still has no changes in the subject of this article. 一直到jdk7u17,本文所说的仍然适用。 Sharing a...

weixin_34153893的博客 301

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

JavaSE学习笔记(Day7)

Day7 Java常用类_API 概述 API(Application Programming Interface)应用程序编程接口 Java程序员在开发Java程序时,只需要安装有Jdk,就可以在程序中使用import关键字导入Java API中指定的包并在自己的程序中使用这些包中定义的各种类和接口。 基本类型包装类 基本数据类型不是面向过程的,为了解决这个不足,在设计类时为每个基本数据类型设计了一个对应的类进行代表,这样八个和基本数据类型对应的类统称为包装类。 包装类(Integer 、Doubl

qq_52750266的博客 508

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Java 语言基础 -- String

Java 语言基础 – String 定义一个字符串: String s1 = “ab”; 使用变量来赋值变量: String s2 = s1; s2 保存了相同的引用值, 因为他们代表同一个对象 字符串连接: s = s1.concat(“ef”); s 中保存的是一个新创建出来的 string 对象的引用 总结(验证字符串的不可变性) 一旦一个 string 对象在内存(堆)中被创建出来, 他就无法被修改。特别要注意的是,String 类的所有方法都没有改变字符串本身的值, 都是返回了一个新的对象。 如

weixin_42744651的博客 269

思维导图05----Java常用类

Java常用类----思维导图 下载地址: https://download.youkuaiyun.com/download/q863672107/20016471 以下是自动转换的MakeDown文本 常用类 字符串相关API String类 概述 String是个final类, 代表不可变的字符序列。 不可变性体现 当对字符串重新赋值时, 需要重新指定内存区域赋值, 不能修改原有的value[ ] 当对现有字符串进行连接操作时, 也需要重新指定内存区域赋值, 当调用String的replace

chenyao的博客~ 524

linux操作命令

​一.系统不在虚拟机中的情况使用ctrl+alt+F1~6切换到命令行界面;ctrl+alt+F7切换到图形界面二.系统在虚拟机中的情况Ctrl+Alt+shift+F1~6切换到命令行界面;使用Alt+F7返回到图形界面三.ctrl+alt返回正常窗口四.退出1.保存退出:esc,然后:wq ,或者直接输入“x”,也是一样的,即::x=:wq。快捷方式:shift+zz 或者切换到大写模式按 ZZw:write,写入q:quit,退出2.不保存退出(:q!

qq_30255033的博客 598

Java+字符串+赋值+相等_【JAVA】字符串操作 —字符串赋值、输出、合并、比较、查找、替换...

一、前言前面,我们整体学习了有关文件操作方面的知识,实现了检测、新建、修改文件并写入或者复制移动的操作。本次学习的是有关字符串方面的操作,为方便大家学习,可以参照API阅读此类的各个方法知识。API链接如下:https://pan.baidu.com/s/1_DMTYTstbDtfdjutBE3h8Q 提取码:elgp字符串广泛应用 在Java 编程中,在 Java 中字符串属于对象,Java 提...

weixin_32620265的博客 490

1768. 交替合并字符串

StringBuffer/StringBuilder 类包含append()方法,append()方法相当于“+”,将指定的字符串追加到此字符序列。如果一个字符串比另一个字符串长,就将多出来的字母追加到合并后字符串的末尾。StringBuffer/StringBuilder.append()追加的字符串在同一个内存地址。charAt(i) 函数 是获取字符串中i+1位置的字符。:可在内存中创建可变的缓冲空间,存储频繁改变的字符串。求两个字符串较短的那个,以它作为循环的限制;的起始下标,非负的整数。

哈哈哈哈丶昊的博客 527

.String 属于基本类型嘛?String 的常用API

String不属于八大基本类型,String是一个jdk所自带的类,可以new对象和调取String特有的API。length()方法,length是用于检查String字符串的长度,会返回一个int类型的值。String常用的API。

m0_68138569的博客 65

学生社团管理系统

本次使用Java技术开发的学生社团管理系统,就是运用计算机来管理学生社团信息,该系统是可以实现团长管理,社团管理,社团申请管理,社团活动管理,社团活动申请管理,论坛管理,学生管理,社团活动留言管理等功能。学生社团管理系统使用计算机处理相关信息,主要是在数据的传输上能达到即可传递,数据不管是想要获取或者输入,都可以及时反馈,极大的提高了效率,使用的MySQL数据库也能让数据更能安全的存储。

xn19950718的博客 398
上一篇: Q:java中serialVersionUID的作用
下一篇: K:谈谈Runtime类中的freeMemory,totalMemory,maxMemory等几个方法
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值