【问题标题】:How JVM allocates memory to static String variables?JVM如何为静态String变量分配内存?
【发布时间】:2017-08-21 10:16:33
【问题描述】:

由于JVM在方法区中为静态变量类型分配内存。但是当涉及到静态字符串类型时,它是从方法区域引用 heap 区域还是在方法区域本身提供内存。如果它引用堆区域,那么 String 将具有相同的行为(对于下面的示例)?

例子:

static String s1 = new String("Aman");
static String s2 = "Aman";

【问题讨论】:

  • 变量是否为static 对字符串的存储位置/方式没有影响。
  • 表示会从方法区引用变量到堆?

标签: java memory-management garbage-collection jvm


【解决方案1】:

您将 变量 s1s2 与它们所指的 对象 混为一谈。

对象在堆中。文字"Aman" 位于堆的字符串池细分中。

变量是静态的,在类中。

【讨论】:

    【解决方案2】:

    由于JVM在方法区为静态变量类型分配内存。

    是的,你是对的,因为静态变量是类级别的变量,因为它们是反射数据(类相关数据,与实例无关)的一部分,它们存储在 PermGenSpace > Method Area 部分堆,

    但是当涉及到静态字符串类型时,它是否指的是堆区域 来自方法区,或者它在方法区本身提供内存。

    无论如何,对象总是只能将内存分配到堆区,但是静态引用变量将存储在方法区中。

    来到你的代码,

    static String s1 = new String("Aman");

    上面的代码行将在堆内存中创建两个对象第一个对象通过 new 关键字和第二个对象通过字符串文字“Aman”在堆内存中但​​记住字符串文字将存储在 StringConstantPool 并引用第二个对象在 StringConstantPool 的堆中,然后将堆中的对象的引用分配给 MethodArea 中存在的引用变量。

    static String s2 = "Aman";

    现在,当编译器执行上述行时,它将检查“Aman”是否已经在 StringConstantPool 中,它不会创建另一个对象,而是会将已经在堆内存中的相同对象返回给方法区域中的静态引用 s2 .

    我希望它会有所帮助。

    【讨论】:

      猜你喜欢
      • 2023-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-21
      • 2014-08-09
      • 2020-11-17
      • 1970-01-01
      • 2013-09-16
      相关资源
      最近更新 更多