Java中的String Interning是多少?我应该在什么时候使用它?why是多少?

推荐答案

http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#intern()

基本上是做弦乐.一系列字符串上的intern()将确保具有相同内容的所有字符串共享相同的内存.所以,如果你有一个名字列表,其中"john"出现了1000次,那么通过实习,你可以确保只有一个"john"实际分配了内存.

这有助于减少程序的内存需求.但是请注意,缓存是由JVM在永久内存池中维护的,与堆相比,永久内存池的大小通常是有限的,所以如果没有太多重复值,就不应该使用intern.


更多关于使用intern()的内存限制的信息

一方面,确实可以通过以下方式删除字符串重复项 把它们内化.问题是内部化的字符串转到 永久生成,这是JVM中保留的一个区域 对于非用户对象,如类、方法和其他内部JVM 对象.这个区域的大小是有限的,而且通常要小得多. 而不是堆在一起.对字符串调用intern()具有移动的效果 它从堆里出来进入永久的世代,你会冒着风险 PermGen空间不足.

--


从JDK7(我指的是HotSpot)开始,有些东西发生了变化.

在JDK 7中,被占用的字符串不再在Java堆的永久生成中分配,而是与应用程序创建的其他对象一起分配在Java堆的主要部分(称为年轻代和老代)中.此更改将导致更多数据驻留在主Java堆中,而在永久生成中的数据更少,因此可能需要调整堆大小.由于此更改,大多数应用程序在堆使用方面只会看到相对较小的差异,但是加载许多类或大量使用String.intern()方法的较大应用程序将会看到更显著的差异.

--从Java SE 7 Features and Enhancements

更新:从Java7开始,插入的字符串存储在主堆中.http://www.oracle.com/technetwork/java/javase/jdk7-relnotes-418459.html#jdk7changes

Java相关问答推荐

判断大写字符串的Java方法总是返回假

Java中Stream(java.util.stream)和linkedList数据 struct 之间是什么关系?

Java Swing绘制gif作为多个JSYS和JLabels的背景

Java 22模式匹配不适用于记录模式匹配.给出汇编问题

空手道比赛条件

方法没有用正确的值填充数组—而是将数组保留为null,'

inteliJ中是否有一个功能可以自动在块注释中的/*后面添加一个空格?''

错误:在Liferay7.4中找不到符号导入com.liferay.portal.kernel.uuid.PortalUUID;";

确定Java中Math.Ranb()输出的上限

Com.google.firebase.database.DatabaseException:无法将类型为java.lang.Boolean的值转换为字符串.这是关于什么的?

如何获取Instant#of EpochSecond(?)的最大值

解析方法";javax/imageio/metadata/IIOMetadata.getAsTree(Ljava/lang/String;)Lorg/w3c/dom/Node时加载约束冲突

如何在JUNIT测试中覆盖ExecutorService?

垃圾收集时间长,会丢弃网络连接,但不会在Kubernetes中反弹Pod

Regex以查找不包含捕获组的行

使用for循环时出现堆栈溢出错误,但如果使用if块执行相同的操作,则不会产生错误

如何使用jOOQ在PostgreSQL中从枚举类型生成Java枚举

基于距离的APACHE POI公式判断

Java返回生成器的实现

这是JavaFX SceneBuilder的错误吗?