String的内存分配与拼接操作,spring并发+JVM调优把我直接问懵了

本文探讨了Java中String对象的内存分配,强调了常量池的作用和不同JDK版本中StringTable的变化。在JDK7以后,String对象存储在堆的主要部分。字符串拼接时,常量与常量的拼接在常量池,变量拼接则通过StringBuilder。使用final修饰的变量在编译期可优化,否则会使用StringBuilder。对于性能敏感的场景,理解这些细节至关重要。
摘要由CSDN通过智能技术生成
  • 在jdk6中StringTable是固定的,就是1009的长度,所以如果常量池中的字符串过多就会导致效率下降很快,StringTablesize设置没有要求。
  • 在jdk7中,StringTable的长度默认值是60013,StringTablesize设置没有要求
  • 在jdk8中,设置StringTable长度的话,1009是可以设置的最小值

String的内存分配


在Java语言中有8种基本数据类型和一种比较特殊的类型String。这些类型为了使它们在运行过程中速度更快、更节省内存,都提供了一种常量池的概念。

常量池就类似一个Java系统级别提供的缓存。8种基本数据类型的常量池都是系统协调的,String类型的常量池比较特殊,存储的主要方法有两种:

  • 直接使用双引号声明出来的String对象会直接存储在常量池中。

  • 如果不是用双引号声明的String对象,可以使用String提供的intern()方法。

在JDK 7以后,内部字符串不再分配在Java堆的永久代中(永久代垃圾回收频率低)而是分配在Java堆的主要部分(年轻代和老年代),所有的字符串都保存在堆中,与应用程序创建的其他对象放在一起。这种变化将导致更多的数据驻留在主Java堆中,而更少的数据在永久代中,因此可能需要调整堆的大小。

在这里插入图片描述

在加载许多类或大量使用String.intern()方法的大型应用程序中可以看到这个改动的明显效果。

样例:


class Memory
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值