JDK1.6中String类的坑,快让我裂开了…

JDK1.6中String类的坑,快让我裂开了…

摘要:JVM优化的目标就是:尽可能让对象都在新生代里分配和回收,尽量别让太多对象频繁进入老年代,避免频繁对老年代进行垃圾回收,同时给系统充足的内存大小,避免新生代频繁的进行垃圾回收。

本文分享自华为云社区《千万不要在生产环境使用这个版本的JDK,这不?内存又溢出了!快要裂开了!(建议收藏)》,作者:冰 河 。

小伙伴的疑问

问题确定

排查问题的整个过程相当耗时,这里,我就直接说定位到的问题吧。后面,我会单独写一篇详细的排查问题过程的文章!

在排查问题的过程中,我发现这位小伙伴使用的JDK还是1.6版本。开始,我也没想那么多,继续排查他写的代码,也没找出什么问题。但是一旦启动生产环境的程序,没过多久,JVM就抛出了内存溢出的异常。

这就奇怪了,怎么回事呢?

启动程序时加上合理的JVM参数,问题依然存在。。。

没办法,继续看他的代码吧!无意间,我发现他写的代码中,大量使用了String类的substring()方法来截取字符串。于是,我便跟到JDK中的代码查看传递进来的参数。

这无意间点进来的一次查看,竟然找到了问题所在!!

JDK1.6中String类的坑

经过分析,竟然发现了JDK1.6中String类的一个大坑!为啥说它是个坑呢?就是因为它的substring()方法会把人坑惨!不多说了,我们先来看下JDK1.6中的String类的substring()方法。

public String substring(int bedinIndex, 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);
}
hmoban主题是根据ripro二开的主题,极致后台体验,无插件,集成会员系统
自学咖网 » JDK1.6中String类的坑,快让我裂开了…