当前位置: 首页 > news >正文

【JVM】StringTable 字符串常量池

参考:javaGuide

字符串常量池 是 JVM 为了提升性能和减少内存消耗针对字符串(String 类)专门开辟的一块区域,主要目的是为了避免字符串的重复创建

String的不可变性

1.通过字面量的方式(区别于new)给一个字符串赋值,此时的字符串值声明在字符串常量池中。
2.字符串常量池中是不会存储相同内容的字符串的。

String的内存分配

Java 6及以前,字符串常量池存放在永久代
Java 7 中 Oracle 的工程师对字符串池的逻辑做了很大的改变,即将字符串常量池的位置调整到Java堆内
Java 8 中,字符串常量仍然在堆

图源:javaguide

在这里插入图片描述
在这里插入图片描述

为什么要改变位置?

主要是因为永久代(方法区实现)的 GC 回收效率太低,只有在整堆收集 (Full GC)的时候才会被执行 GC。Java 程序中通常会有大量的被创建的字符串等待回收,将字符串常量池放到堆中,能够更高效及时地回收字符串内存。


intern() 方法与 new String()

String s1 = new String("abc"); 这句话创建了几个字符串对象?
会创建 1 或 2 个字符串对象。
1、如果字符串常量池中不存在字符串对象“abc”的引用,那么它会在堆上创建两个字符串对象,其中一个字符串对象的引用会被保存在字符串常量池中。
2、如果字符串常量池中已存在字符串对象“abc”的引用,则只会在堆中创建 1 个字符串对象“abc”。


String.intern() 是一个 native(本地)方法,其作用是将指定的字符串对象的引用保存在字符串常量池中,可以简单分为两种情况:
● 如果字符串常量池中保存了对应的字符串对象的引用,就直接返回该引用
● 如果字符串常量池中没有保存对应的字符串对象的引用,那就在常量池中创建一个指向该字符串对象的引用并返回。

StringTable数据结构(拓展)

具体细节:数组+链表

  • String的String Pool是一个固定大小的Hashtable保存的是字符串(key)和 字符串对象的引用(value)的映射关系),默认值大小长度是1009,如果放进String Pool的String非常多,就会造成Hash冲突严重,从而导致链表会很长,而链表长了后直接会造成的影响就是当调用String.intern时性能会大幅下降(因为要一个一个找)。
  • jdk6中StringTable是固定的,就是1009的长度,所以如果常量池中的字符串过多就会导致效率下降很快。在jdk7中,StringTable的长度可以通过一个参数指定
    -XX:StringTableSize=99991
http://www.lryc.cn/news/308218.html

相关文章:

  • Unity中URP实现水体(水的焦散)
  • vue构建版本
  • Docker挂载镜像到本地(日常记录)
  • 【Elasticsearch查询】精确查询
  • 小狐狸chat2.7.2免授权修复版可用版
  • 通过QScrollArea寻找最后一个弹簧并且设置弹簧大小
  • 為什麼使用海外動態代理IP進行網路爬蟲?
  • LeetCode 热题100 刷题笔记
  • veridata安装
  • 面试笔记系列三之spring基础知识点整理及常见面试题
  • 面试笔记系列四之SpringBoot+SpringCloud+计算机网络基础知识点整理及常见面试题
  • Kernel[Device Tree] - 1. 设备树的由来
  • 第十四天-网络爬虫基础
  • Linux系统安装
  • springboot-基础-thymeleaf配置+YAML语法
  • 深入理解分库、分表、分库分表
  • Oracle中序列
  • 蓝牙耳机和笔记本电脑配对连接上了,播放设备里没有显示蓝牙耳机这个设备,选不了输出设备
  • Cadence Allegro PCB设计88问解析(三十四) 之 Allegro 中 DDR等长处理
  • 向爬虫而生---Redis 探究篇2<redis集群(1)>
  • [云原生] 二进制安装K8S(上)搭建单机matser、etcd集群和node节点
  • 乘积尾零(蓝桥杯)
  • 项目解决方案: 实时视频拼接方案介绍
  • 雾锁王国Enshrouded服务器CPU内存配置怎么选择?
  • yolov9,使用自定义的数据训练推理
  • 企业文件图纸加密有哪些?图纸文件加密防泄密软件如何选?
  • phpldapadmin This base cannot be created with PLA
  • 如何开发自己的npm包并上传到npm官网可以下载
  • Linux Shell脚本练习(一)
  • 面试数据库篇(mysql)- 11主从同步