一。字符串对象在jvm存放的位置
字符串常量池和堆内存
1.使用常量字符串初始化的字符串对象,它的值存放在字符串常量池中;
2.使用字符串构造方法创建的字符串对象,它的值存放在堆内存中;
在1.7之前,字符串常量池是在
PermGen区域
,这个区域的大小是固定的,不能在运行时根据需要扩大,也不能被垃圾收集器回收,因此如果程序中有太多的字符串调用了intern方法的话,就可能造成OOM。
在1.7以后,字符串常量池移到了堆内存中,并且可以被垃圾收集器回收,这个改动
降低了字符串常量池OOM的风险
。
由上图可知,两种不同方法创建出来的相同字符串的内存地址是有差异的。单身提供了intern方法;
二。intern是什么,做了什么?
如果常量池中有这个字符串常量,就直接返回,否则将该字符串对象的值存入常量池,再返回。
版权声明:本文为qq_39809613原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。