0

字符串在Java 中是不可变的,即每次我们对字符串对象进行更改时,它都会创建一个新实例,而旧对象将变为未引用,即浪费。所以在一个大程序中会有很多无法访问的未引用对象。java管理这个吗?如何?例如-

String s="abc";
s=s.concat("def");

现在对象“abc”根本不能被引用,但由于字符串是不可变的,它仍然存在于内存池中。

4

3 回答 3

2

首先,听起来您需要 Java 中的崩溃源和垃圾收集。话虽如此,有几个基本点需要澄清:

1) 仅仅因为一个对象是不可变的并不意味着它的内存被泄露了。如果不存在对不可变对象的引用,则它与任何其他对象一样有资格进行垃圾回收。

2)字符串常量是一个例外,因为它们总是被JVM 保留。这意味着字符串常量保存在一个特殊的内存池中,每当创建一个字符串时,首先检查这个池以查看该字符串是否已经存在。如果是,则返回对它的引用。(您可以使用该方法强制非常量字符串加入池String.intern())。

3)这些字符串占用的内存量是如此之小,以至于您基本上不必担心它。

于 2013-10-24T05:38:40.860 回答
1

Java 有自动垃圾收集器,它一直在后台运行。这个垃圾收集器会不断检查未使用的对象,一旦它检测到/找到任何此类对象,它就会销毁它,即释放该特定对象使用的内存/资源。这由 JVM 负责,所以您不必担心。但是,如果您愿意,可以指示 JVM 进行垃圾收集。之后 JVM 可以相应地安排垃圾收集

要了解垃圾收集的工作原理,请查看以下链接:

http://javarevisited.blogspot.in/2011/04/garbage-collection-in-java.html

http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html

于 2013-10-24T05:35:09.707 回答
-1

Java中的内存管理由JVM完成,即JVM中的垃圾收集器

当所有对象具有引用时,它们都存储在堆中

MyCode ref=new MyCode();

垃圾收集器在两种情况下验证垃圾收集的对象

  1. 如果对对象的引用变为空
ref=null;
  1. 当孤立岛发生时

http://www.geeksforgeeks.org/island-of-isolation-in-java/

内存管理与 String 对象有些不同,因为上面的答案已经解释过了

于 2017-03-03T09:55:54.077 回答