【问题标题】:Java different types optimalization / cachingJava 不同类型的优化/缓存
【发布时间】: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)、intlongchar 的值是原始类型,因此不需要缓存在全部
  • 在 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


【解决方案1】:

字符串是特殊的——它们是唯一对文字有语法级支持的非原始类型。正如您的引述所说,String 文字(和 not String 实例以任何其他方式构造)总是在 JVM 中重用。所有其他类,包括 LongInteger,只缓存它们设计用来缓存的内容。

查看Integer.valueOf(int)的文档:

通过缓存频繁请求的值,此方法可能会产生明显更好的空间和时间性能 [比new Integer()]。此方法将始终缓存 -128 到 127(含)范围内的值,并可能缓存此范围之外的其他值。

如您所见,Integer 支持缓存,但仅在某些情况下。如果您改为调用new Integer(),您将始终获得一个新实例,即使存在另一个等效对象。 String 也是如此 - 如果您调用 new String(),则保证结果是不同的对象。换句话说:

"foo" == new String("foo")

将始终为 false,无论 Java 的 String 文字缓存行为如何。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-23
    • 2017-04-08
    • 2011-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-16
    • 2012-07-09
    相关资源
    最近更新 更多