JVM如何将内存分配给静态String变量?

时间:2017-08-21 10:16:34

标签: java memory-management garbage-collection jvm

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

示例:

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

2 个答案:

答案 0 :(得分:3)

您将变量 db.test.update( {'_id' : ObjectId("599a910be15dad0b144363d7"), 'categories.subId': '1.1'}, { $set : { 'categories.$.subTitle' : 'New title' } } ) var json = ""; using (WebClient client = new WebClient()) { json = client.DownloadString("https://www.reddit.com/r/wallpaper/hot.json?count=25"); JObject data = JObject.Parse(json); string dat2 = data["url"].Value<string>(); } 与他们引用的对象混为一谈。

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

变量是静态的,属于类。

答案 1 :(得分:0)

  

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

是的,你是对的,因为静态变量是类级变量,因为它们是反射数据(类相关数据,而不是实例相关)的一部分,它们存储在 PermGenSpace&gt;中。堆的方法区部分,

  

但是当涉及到静态字符串类型时它会引用堆区域   从方法区域或它在方法区域中提供内存。

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

来到你的代码,

  

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

上面的代码行将通过new关键字创建两个对象1st对象,通过string literal创建第二个对象&#34; Aman&#34;在堆内存中,但请记住字符串文字将存储在 StringConstantPool 中,并从StringConstantPool中引用堆中的第二个对象,然后将堆中对象的引用分配给引用变量,即存在于MethodArea中。

  

static String s2 = "Aman";

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

我希望它会有所帮助。