java string pool 栈_Java的String常量池在哪里存在,堆还是堆栈?

String pooling

字符串池(有时也称为字符串规范化)是使用单个共享String对象替换具有相同值但不同标识的多个String对象的过程 . 您可以通过保留自己的Map(根据您的要求可能有软或弱引用)并使用map值作为规范化值来实现此目标 . 或者您可以使用JDK提供给您的String.intern()方法 . 在Java 6时,使用String.intern()被许多标准禁止,因为如果池失控,很可能获得OutOfMemoryException . 字符串池的Oracle Java 7实现发生了很大变化 . 您可以在http://bugs.sun.com/view_bug.do?bug_id=6962931和http://bugs.sun.com/view_bug.do?bug_id=6962930中查找详细信息 .

String.intern() in Java 6

在那些美好的旧时代,所有实习字符串都存储在PermGen中 - 堆的固定大小部分主要用于存储加载的类和字符串池 . 除了显式实现的字符串之外,PermGen字符串池还包含程序中先前使用的所有文字字符串(这里使用的重要字 - 如果类或方法是永远不会加载/调用,其中定义的任何常量都不会被加载) . Java 6中这种字符串池的最大问题是它的位置 - PermGen . PermGen具有固定大小,无法在运行时扩展 . 您可以使用-XX:MaxPermSize = 96m选项进行设置 . 据我所知,默认的PermGen大小在32M到96M之间变化,具体取决于平台 . 您可以增加其大小,但其大小仍将固定 . 这种限制需要非常小心地使用String.intern - 你最好不要使用这种方法实现任何不受控制的用户输入 . 这就是为什么Java 6时的字符串池主要在手动管理的映射中实现的原因 .

String.intern() in Java 7

Oracle工程师对Java 7中的字符串池逻辑进行了非常重要的更改 - 字符串池已重新定位到堆中 . 这意味着您不再受限于单独的固定大小的内存区域 . 所有字符串现在都位于堆中,与大多数其他普通对象一样,它允许您在调整应用程序时仅管理堆大小 . 从技术上讲,仅此一点可能是重新考虑在Java 7程序中使用String.intern()的充分理由 . 但还有其他原因 .

String pool values are garbage collected

是的,如果程序根目录中没有对它们的引用,则JVM字符串池中的所有字符串都有资格进行垃圾回收 . 它适用于所有讨论过的Java版本 . 这意味着如果您的实习字符串超出范围并且没有其他引用 - 它将从JVM字符串池中进行垃圾收集 . 有资格进行垃圾收集并驻留在堆中,JVM字符串池似乎是所有字符串的正确位置,不是吗?理论上确实如此 - 未使用的字符串将从池中进行垃圾收集,使用的字符串将允许您节省内存,以防从输入中获得相等的字符串 . 似乎是一个完美的记忆保存策略?几乎如此 . 在做出任何决定之前,您必须知道如何实现字符串池 .

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值