【发布时间】:2015-05-03 14:57:12
【问题描述】:
我知道字符串/文字已经过优化 - 它们存储在 NoHeap PermanentGeneration - 内部字符串中,因此如果您创建两个相同的文字,它们将指向内存中的相同地址。
内部字符串(字符串表) Java 语言规范要求包含相同 Unicode 代码点序列的相同字符串文字必须引用相同的 String 实例。此外,如果在 String 的实例上调用 String.intern(),则必须返回一个引用,如果字符串是文字,则该引用与返回的引用相同。因此,以下情况成立: ("j" + "v" + "m").intern() == "jvm"
其他类型呢?它们是否存储在某个 JVM 区域中?我听说整数以某种方式被缓存 - 但是在 JVM 中还是在 Integer 类中以静态方式?是否缓存了所有整数 - 从 Integer.min_value 到 max_value?像 int 这样的简单类型也会被缓存吗? BigDecimal、Long、char 等其他类型呢?
Long、Integer 等大类型是否与 long 和 int 缓存在同一个位置? JVM还是哪里?
【问题讨论】:
-
查看
Integer.valueOf(int)等的文档。您应该会找到答案。 -
Integers 缓存从 -128 到 127 (stackoverflow.com/questions/3131136/integers-caching-in-java)、int、long和char的值是原始类型,因此不需要缓存在全部 -
在 src.zip、java/lang/Integer.java 中,我看到了 IntegerCache 类的显式实现。所以看起来 Integer 是显式缓存的,而 String interning 是 JVM 特性。
-
如果你想缓存值,你也可以创建自己的内部。见docs.guava-libraries.googlecode.com/git/javadoc/com/google/…。
-
忘记永久代。它已在 Java 8 中使用,Java 7 为 no longer supported。所有 Java 对象都存在于堆中(包括缓存的整数、长整数等)。
标签: java memory-management jvm