繁体   English   中英

Java-字符串内存泄漏

[英]Java - String Memory Leaks

String str1 = "Test";
final String str2 = new String("Test");

众所周知,str1将在字符串池中创建,而str2将在堆中创建。 在这里,两个对象都是不可变的。 性能(在执行GC时)有什么区别吗? 说在Heap中创建String对象会导致内存泄漏是正确的吗?

说在Heap中创建String对象会导致内存泄漏是正确的吗?

否。当没有对该对象的引用时,它将像任何其他对象一样有资格进行垃圾回收。

不,堆中的String对象不会导致内存泄漏。 可以像常规对象一样对它们进行垃圾收集。

但是,您可能要使用大量内存来保存内容相同的字符串对象。 与创建一百万个不同的对象相比,持有一百万个对同一对象的引用的内存效率更高。

请注意,您可以使用intern函数将在运行时获得的字符串添加到String池中。

public class Test {
   public static void main(String[] args) {
      new Test().run();
   }

   private void run() {
      String str1 = "Test";
      String str2 = "Test";
      System.out.println(str1 == str2);

      String str3 = new String("Test");
      String str4 = new String("Test");
      System.out.println(str3 == str4);

      String str5 = str3.intern();
      String str6 = str3.intern();
      System.out.println(str5 == str6);
   }
}

输出:

true
false
true

尽管确实是将字符串对象存储在堆中并进行垃圾回收,但是我遇到了一些问题,因为JVM会保留引用。 查看javolution,它是一个实时库,可以帮助您优化代码以实现高吞吐量。 事后看来,由于我们遇到的所有问题,我会选择与Java不同的语言,但是这里是:

http://javolution.org/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM