- 在Java语言中有8种基本数据类型和一种比较特殊的类型String。这些类型为了使它们在运行过程中速度更快、更节省内存,都提供了一种常量池的概念。
- 常量池就类似一个Java系统级别提供的缓存。8种基本数据类型的常量池都是系统协调额,String类型的常量池比较特殊。它的主要使用方法有两种
- 直接使用双引号出来的String对象会直接存储在常量池中。比如:String info=”坚持“;
- 如果不是用双引号声明出来的String对象,可以使用String提供的intern()方法。
- Java 6及之前,字符串常量存放在永久代。
- Java 7中Oracle的工程师对字符串池的逻辑做了很大的改变,即将字符串常量池的位置调整到Java堆内。
- 所有的字符串都保存在堆(Heap)中,和其他普通对象一样,这样可以让你在进行调优应用时仅需要调整堆大小就可以了。
- 字符串常量池概念原本使用的比较多,但是这个改动使得我们有足够的理由让我们重新考虑在Java 7中使用String.intern()。
- Java8元空间,字符串常量在堆
1、jdk 6 内存图
2、jdk 7 内存图
3、StringTable为什么要调整?
- permSize默认比较小
- 永久代垃圾回收频率低