JVM入门级个人总结(二)StringTable

本文概述了JVM 1.8中StringTable的变化,包括常量池与串池的关系,1.8和1.6的字符串对象行为差异,以及如何通过调整StringTableSize进行性能调优。重点讲解了字符串对象的创建、存储和垃圾回收机制。
摘要由CSDN通过智能技术生成

JVM个人总结(二)

(个人对黑马程序员JVM完整教程总结,原视频地址https://www.bilibili.com/video/BV1yE411Z7AP)

StringTable

串池 (1.8 中的 StringTable 在 堆 中)

是 hashtable 结构,不能扩容
在这里插入图片描述

常量池和串池的关系
  1. 常量池中的信息都会被加载到运行时常量池中,这时a b ab 都是常量池中的符号,还没变为java字符串对象
  2. 要等具体执行到 String s1 = “a” 这行代码时
  3. ldc #2 会把 a 符号变为 “a”字符串对象
  4. 将 “a” 尝试放入 串池 (如果 有 则并不会放入,如果 没有 则放入串池,会把串池中的对象返回 1.8)
    在这里插入图片描述
    每个字符串对象在串池中都是唯一的
StringTable特性

1、常量池中的字符串仅是符号,第一次用到时才变为对象,

2、利用串池的机制,来避免重复创建字符串对象

3、字符串变量拼接的原理是 StringBuild (1.8)

4、字符串常量拼接的原理是编译期优化

5、可以用intern方法,主动将串池中还没有的字符串对象放入串池

  • 1.8将这个字符串对象尝试放入串池,如果 有 则并不会放入,如果 没有 则放入串池,会把串池中的对象返回
  • 1.6将这个字符串对象尝试放入串池,如果 有 则并不会放入,如果 没有 则会把此对象复制一份(重新new),放入串池,会把串池中的对象返回

(1.8)

在这里插入图片描述
new String(“a”) 出来的对象是存在 堆 中的,但是串池中也会保存字符串 “a”

(1.8)
在这里插入图片描述
在这里插入图片描述

StringTable 位置

在这里插入图片描述

1.6 在方法区中,具体占用永久代的内存

1.8 在堆空间中,占用堆内存

StringTable 垃圾回收
  • StringTable是会发生垃圾回收的
  • StringTable 是hashtable,不能扩容,当内存空间不足时,无用的不常用的字符串就会被垃圾回收
StringTable 性能调优
  • 调整 -XX:StringTableSize=桶个数(一般是调大)
    不常用的字符串就会被垃圾回收
StringTable 性能调优
  • 调整 -XX:StringTableSize=桶个数(一般是调大)
  • 考虑将字符串对象是否入池。如果应用里有 大量的字符串,并且存在重复问题,可以让字符串入池来减少字符串个数来减少堆内存的使用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值