首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >方法本地字符串内存分配?

方法本地字符串内存分配?
EN

Stack Overflow用户
提问于 2014-08-08 17:24:37
回答 1查看 347关注 0票数 2

我理解字符串池和intern()方法是如何在java中工作的。这里是一个简短的介绍。

Java 6中的String.intern()

在过去,所有的内联字符串都存储在PermGen中--堆的固定大小部分主要用于存储加载的类和字符串池。除了显式内嵌字符串之外,PermGen字符串池还包含程序中先前使用的所有文字字符串(此处使用了重要的单词--如果从未加载/调用过类或方法,则不会加载其中定义的任何常量)。 Java 6中这种字符串池的最大问题是它的位置-- PermGen。PermGen具有固定的大小,不能在运行时进行扩展。您可以使用-XX:MaxPermSize=96m选项来设置它。据我所知,根据平台的不同,默认的PermGen大小在32米到96米之间。您可以增加它的大小,但它的大小仍然是固定的。这样的限制需要非常小心地使用String.intern --您最好不要使用此方法进行任何不受控制的用户输入。这就是为什么Java 6时的字符串池大多是在手动管理的映射中实现的。

Java 7中的String.intern()

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

来源

到目前为止,我对String如何存储在内存中感到满意,直到我看到这个工具Java可视化器。我编写了以下简单的Java类,以可视化如何在程序中分配内存。

代码语言:javascript
运行
复制
public class A {

   String iWillAlwaysBeOnHeap="I am on heap...!!!";


   class Dummy{

      private int dummyNumber;

      Dummy(int dummyNumber)
      {
         this.dummyNumber=dummyNumber;
      }
   }

   public static void main(String[] args) {
      A a=new A();
      a.lonelyMethod();
   }


   public void lonelyMethod()
   {
      String lostString="dangling";

      String test=new String("dangling");

      test.intern();

      String duplicateLiteral="dangling"; 

      Dummy dummy=new Dummy(4);
   }


}

我得到了以下结果:

如您所见,具有相同值的字符串、文字和对象被重复并存储在堆栈中,堆空间不会出现在方法本地字符串的图片中。起初我很困惑,但后来我搜索并发现了由JDK 7自动完成的逃逸分析。但是在我的代码中,我已经创建了一个字符串对象,它应该存储在堆上,但正如您在可视化器输出中看到的那样,它在堆栈中,但是我的虚拟类对象存储在堆上。我不能真正理解这种行为。方法本地字符串如何与其他对象和实例级字符串不同?

EN

回答 1

Stack Overflow用户

发布于 2014-08-08 17:55:34

我想你误解了视觉器的输出。堆栈上有三个对字符串对象的引用,对应于lonelyMethod中的三个局部变量。似乎“为了您的方便”,Java显示引用对象的字符串表示,但这并不是堆栈上的实际内容。引用的对象看起来都是相同的,但其中两个引用的是内部字符串“悬空”,第三个(实际上是对应于变量test的第二个)引用堆上的一个单独的String对象。

我认为可以显示堆栈上每个对象引用的标识哈希代码,但这(通常)不太有用。也许在可视化器中有一个设置来启用这样的行为。这将有助于澄清到底发生了什么。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25208933

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档