大家知道,Java中string.intern()方法调用会先去字符串常量池中查找相应的字符串,如果字符串不存在,就会在字符串常量池中创建该字符串然后再返回。

字符串常量池是一个固定大小的HashMap,桶的数量默认是1009, 从Java7u40开始,该默认值增大到60013。在Java6当中,字符串常量池是放在Perm空间的,从Java7开始,字符串常量池被移到Heap空间。下面,我们通过测试程序来窥探字符串常量池在Java6,Java7两个不同版本底下的内存分配情况。

测试程序

public class StringPoolTest {

public void testStringPoolWithLongString(){

long i=0;

while(true){

String longString = "This is a very long string, very very long string to test the gc behavior of the string constant pool"+i;

longString.intern();

i++;

}

}

public static void main(String[] args){

StringPoolTest stringPoolTest = new StringPoolTest();

stringPoolTest.testStringPoolWithLongString();

}

}

测试程序很简单,一个死循环,循环里面通过递增变量i制造唯一的字符串,然后用main函数启动程序。

Java 6

我们使用版本Jdk1.6.0_29来跑该程序,打开Java VisualVM监控,可以看到,Perm区不断发生GC,由此的出结论,虽然字符串常量池放在Perm空间,但当Perm空间接近满的时候,JVM会将字符串常量池中的无用字符串回收掉。

Java 7

下面,我们切换到Jdk1.7.0_67重跑该程序,可以看到Perm区内存分配曲线很平滑,没有出现内存分配的现象。

但在Heap空间,新的对象不断产生,然后不断触发GC

结论

由于Perm区大小是有限的,通常只有几十MB,所以不推荐在Java6下广泛使用String.intern(),这篇文章string-intern-in-java-6-7-8的性能测试表明,在Java6底下大量使用intern()会导致应用性能的显著下降,还有可能产生OOM错误。但从Java7开始,字符串常量池被移到了Heap空间,Heap空间的大小只受制于机器的真实内存大小,因此,在Java7下使用String.intern()能更有效地减少重复String对象对内存的占用。

java字符串内存长度固定_深入理解 Java String#intern() 内存模型相关推荐

  1. java虚拟机和内存的关系_深入理解java虚拟机(linux与jvm内存关系)

    本文转载自美团技术团队发表的同名文章 https://tech.meituan.com/linux-jvm-memory.html 一, linux与进程内存模型 要理解jvm最重要的一点是要知道jv ...

  2. 以下描述java字符串错误的是_浙江理工大学java题库

    private protected private? protected public 40.声明成员变量时,如果不使用任何访问控制符(public, protected, private),则以下哪 ...

  3. java中io是什么_深入理解Java中的IO

    深入理解Java中的IO 转载自:http://blog.csdn.net/qq_25184739/article/details/51205186 本文的目录视图如下: Java IO概要 a.Ja ...

  4. 深入java虚拟机 第四版_深入理解Java虚拟机-常用vm参数分析

    Java虚拟机深入理解系列全部文章更新中... https://blog.ouyangsihai.cn/shen-ru-li-jie-java-xu-ni-ji-java-nei-cun-qu-yu- ...

  5. java字符串常量存哪里_浅谈JAVA中字符串常量的储存位置

    在讲述这些之前我们需要一些预备知识: Java的内存结构我们可以通过两个方面去看待它. 从该角度看的话Java内存结构包含以下部分:该部分内容可以结合:JVM简介(更加详细深入的介绍) 1.栈区:由编 ...

  6. java spring boot 注解验证_如何理解Java原生注解和Spring 各种注解?

    作者:digdeep .cnblogs.com/digdeep/p/4525567.html 导引 Spring中的注解大概可以分为两大类: spring的bean容器相关的注解,或者说bean工厂相 ...

  7. java字符串删掉子串_如何从Java中的列表中删除子列表?

    java字符串删掉子串 从列表中删除子列表 (Removing SubList from a List) Suppose, we have a list of few elements like th ...

  8. java字符串字符排列组合_如何在Java中查找字符串的所有排列

    java字符串字符排列组合 In this tutorial, we will learn how to find the permutation of a String in a Java Prog ...

  9. java如果不使用多态_深入理解java多态没有烤山药的存在,java就不香了吗?

    @ 我不想知道各位理解java多态没有烤山药的存在,java香不香的问题了,我不要你们认为,我只要我觉得 (感觉要被打....) 在博主认为多态绝对是面向对象的第三大特性中让很多小白同学以及初学者难以 ...

最新文章

  1. 2021山西高考成绩位次查询,2021年山西高考位次查询及一分一段表排名查询
  2. kvm热添加和热迁移
  3. 哪种Python IDE最适合你?这里有一份优缺点列表
  4. The Longest Increasing Subsequence (LIS)
  5. android Java BASE64编码和解码二:图片的编码和解码
  6. 机器学习 文本分类 代码_无需担心机器学习-如何在少于10行代码中对文本进行分类
  7. mysql重启.....
  8. oracle数据库的字符集更改
  9. 特征选择 ReliefF算法
  10. anaconda的使用
  11. python多层bp网络_多层bp神经网络 python
  12. python实现遗传算法实例_遗传算法求解旅行商问题
  13. Tableau商业智能与可视化应用实战系列视频教程(史上最全)
  14. Arduino与SG90舵机握手
  15. android 重复文件夹,清理手机空间小工具!搜索重复文件App
  16. 固定资产管理mysql_固定资产管理系统数据库
  17. 数组和链表数据结构描述,各自的时间复杂度
  18. 怎样用比较器实现信号的衰减和饱和_【白皮书】利用信号调理提高测量质量(中)...
  19. CentOS7安装Stegsolve不报错
  20. ubuntu16.04纯净系统配置安装集锦

热门文章

  1. Linux一些软件的安装
  2. linux大数据命令操作
  3. adb shell 修改文件名_shell修改文件名(一)
  4. 西南交大计算机辅助制造a卷,计算机辅助制造 西南交大作业.doc
  5. 计算机排名考研,计算机考研学校排名
  6. linux查看设备在哪个cpu上,如何在linux中查看cpu信息、机器硬件型号
  7. WPF——专用枚举器ListBox和ComboBox
  8. 微软简化 Windows 10 上的 WSL 安装
  9. 荣耀 Magicbook Pro 锐龙版搭载深度操作系统桌面版
  10. Microsoft Visual Studio使用NodeJS