太卷了,这份Java性能调优手册仅上线1小时,竟被恶意封杀下架

154 篇文章 3 订阅
153 篇文章 1 订阅

在各大厂的面试中,性能优化的问题肯定不会缺席,这足以说明其重要性。今天给大家带来的便是由资深程序员葛一鸣老师写的《Java程序性能优化实战》,同样是没有开源版本,我会将领取方式放在文末

Java程序性能优化实战

我看过几篇讲解Java程序性能优化的图书,要么是内容不够深入,要么是过于晦涩难懂,不够浅显,而这本书却让我眼前一亮,很多困扰我的问题都能在书中找到答案。它涵盖了各种程序员所需的性能优化知识点,是Java开发者提升水平的必读佳作

来看看目录内容,里面一定有你想看的

​亮个相吧(狗头.jpg)

想要更进一步的Java开发者一定不能错过!记得关注公众号:Java收藏夹,即可获取免费领取方式,先到先得

substring()方法的内存泄漏

截取子字符串是字符串操作中最常用的操作之一。在Java 中,String类提供了以下两个截取子字符串的方法:
public String substring(int beginIndex)
public String substring(int beginIndex, int endIndex)
以第 2 个方法为例,它返回原字符串中以 beginIndex 开始,到 endIndex为止的子字符串。然而,这个方法在 JDK 的实现中存在严重的 内存泄漏问题。此方法的源代码(Java 6代码)如下:
public String substring(int beginIndex, int endIndex) {
if (beginIndex < 0) {
throw new StringIndexOutOfBoundsException(beginIndex);
}
if (endIndex > count) {
throw new StringIndexOutOfBoundsException(endIndex);
}
if (beginIndex > endIndex) {
throw new StringIndexOutOfBoundsException(endIndex - beginIndex);
}
return ((beginIndex == 0) && (endIndex == count)) ? this :
new String(offset + beginIndex, endIndex - beginIndex, value);
}

在方法的最后返回了一个新建的String对象。该String的构造函数如 下:

// 包内可见的构造器,通过共享数组内容加速访问
String(int offset, int count, char value[]) {
this.value = value;
this.offset = offset;
this.count = count;
}
在源码的注释中说明这是一个包作用域的构造函数,其目的是为了能高效且快速地共享String 内的 char 数组对象。但在这种通过偏移量来截 取字符串的方法中,String 的原生内容 value 数组被复制到新的子字符串 中。
设想,如果原始字符串很长,截取的字符串长度却很短,那么截取 的子字符串中包含原生字符串的所有内容,并占据了相应的内存空间,而仅通过偏移量和长度来决定自己的实际取值。因此这种算法提高了运 算速度却浪费了大量的内存空间

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值