今天再看JDK源码的时候看到了String类的不同版本的实现方式的不同,主要是substring这个方法,JDK6里面的实现方式是:

wKioL1Qn0-HhwQcAAAL5qPztuWI993.jpg

wKiom1Qn07jxe5AZAAEwB_pzjz8521.jpg

很明显可以看到,调用String对象的substring方法后指向的对象地址并没有发生改变,只是改变的是偏移量,这样的话在GC阶段就有可能造成内存泄露了。

  还好查了一下资料JDK7解决了这个问题,于是赶紧查看了JDK7的源码:

wKioL1Qn1HSTr4pSAAKxL6VlXRo252.jpg

wKiom1Qn1EzCgnDVAAJoairhoMQ543.jpg

这个里面是通过内存复制的方式重新指向了一个新的地址,解决了内存泄露的隐患