JVM如何为静态字符串变量分配内存?

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

例:

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

您正在将变量s1s2与它们引用的对象混合在一起。

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

这些变量是静态的,都在类中。


由于JVM将内存分配给方法区域中的静态变量类型。

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

但是,当涉及到静态字符串类型时,它是指方法区域中的堆区,还是它本身在方法区中提供了内存。

无论如何,查看对象总是只获取堆积区的内存,但是静态引用变量将存储在方法区中。

来到你的代码,

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

上面的代码行将通过新的关键字创建两个对象第一个对象,并通过堆内存中的字符串文字“Aman”创建第二个对象,但是请记住字符串文字将存储在StringConstantPool中,并引用StringConstantPool堆中的第二个对象,之后您将堆中的对象的引用赋值给MethodArea中存在的引用变量。

static String s2 = "Aman";

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

我希望这会有所帮助。

链接地址: http://www.djcxy.com/p/82603.html

上一篇: How JVM allocates memory to static String variables?

下一篇: memory management for a value and reference type