java字符串中的内存管理?

时间:2012-05-02 07:01:01

标签: java

我已经创建了字符串对象,如下所示

案例1:

  String s1="mystring";//Address location is 1000
  String s1="yourstring";
  String s2="mystring";

案例2:

  String s1=new String("mystring");//Address location is 1000
  String s1=new String("yourstring");
  String s2=new String("mystring");

ref

据我所知,这些字符串存储在具有特定内存位置的Case1的字符串常量池中,类似于在堆内存中创建case2对象。如果我们为String对象分配相同或不同的字符串,那么如何通过垃圾收集器管理和释放这些内存。

6 个答案:

答案 0 :(得分:2)

如果您来自C ++,那么一切都在堆上。此外,字符串在Java中是不可变的(创建后不能更改)。由于存在垃圾收集器,因此无需显式释放任何内容。

答案 1 :(得分:1)

应用程序将取决于最初分配给它的当前内存。如果你创建一个新字符串,它将分配一个具有字符串大小的内存。如果没有足够的内存,它会抛出错误作为你的堆已经筋疲力尽。垃圾收集器一旦对象没有任何引用就释放内存。你无法控制它。

但是目前,您当前的代码片段将无法编译,并且在创建String :)时会出现错误。

答案 2 :(得分:0)

字符串存储在Case1(文字字符串)的字符串常量池中。在第2种情况下,即使使用新对象创建字符串,也会检查对象的内容。如果它等于文字字符串对象的内容,那么对象引用将指向文字字符串对象。

垃圾收集: 如果没有对象引用指向字符串文字对象“mystring”(在你的情况下)那么它将不会被垃圾收集,这些对象将一直保留到程序生命周期。程序结束时将删除字符串文字对象。对于其他字符串对象,即使用关键字new,当没有对象引用指向该对象时,这些对象将被垃圾收集。

答案 3 :(得分:0)

就我对Java的理解而言,在第一种形式(即使用=运算符)中,字符串是从Java维护的字符串池中分配的。因此,在第一种情况下,当您将"mystring"分配给变量s2时,会为其分配对最初创建s1时存在的相同字符串的引用。

但是在使用构造函数的情况下,您将创建String对象的全新实例。所以现在有三个对三个不同字符串的引用。

就内存而言,Java将垃圾收集器实现为守护程序线程,只要JVM处于运行状态,它就会运行。它将删除没有引用的所有对象。所以在第一种情况下,没有垃圾收集,但在第二种情况下,一个字符串将是垃圾收集。

答案 4 :(得分:0)

我认为你在想字符串实习。但是,由于两种情况都涉及字符串文字,因此在两种情况下都会看到字符串实习。案例2当然不是针对案例1的内存优化。

查看类似问题What is the purpose of the expression "new String(...)" in Java?

答案 5 :(得分:0)

与其他帖子类似 - 这会让您更好地了解和澄清What's the difference between String s = "something"; and String s = new String("something");