JVM如何为静态字符串变量分配内存?
由于JVM将内存分配给方法区域中的静态变量类型。 但是,当涉及到静态字符串类型时,它是指方法区域中的堆区,还是它本身在方法区中提供了内存。 如果它指向堆区,那么String将具有相同的行为(例如下面的例子)?
例:
static String s1 = new String("Aman");
static String s2 = "Aman";
您正在将变量s1
和s2
与它们引用的对象混合在一起。
对象在堆中。 文字"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