Java内存管理以及何时销毁对象

时间:2014-03-05 15:26:34

标签: java

我编写了一个小型Java程序,我在其中创建了10个String对象。

有人可以解释或回答以下问题。

  1. 创建对象的最佳做法是什么?即;当我创建一个Object时,我也要确保在使用它后删除它。如果,如何删除它?
  2. 如果我不删除该对象,该对象是否会在程序结束前撒谎?
  3. 有没有办法在程序运行时检查活动对象的数量?
  4. public class Test{
    
        static public void main(String[] args){
            for (Integer i = 0; i < 10; i ++){
                String s1 = new String("Creating new String");
            }
            System.out.println("Program COmpleted");
        }
    
    }
    

5 个答案:

答案 0 :(得分:2)

  

当我创建一个Object时,我还要确保在使用它后删除该对象。

没有。您无法在Java中显式删除对象。对于某些内存密集型用例,explicitly nullify references对您的对象可能有意义,以帮助垃圾收集器进行清理过程,但在垃圾收集器收集对象本身之前不会删除它。

  

如果我不删除该对象,该对象是否会在程序结束前撒谎?

没有。一旦没有对它的引用,垃圾收集器将负责删除它。发生这种情况的时间点取决于垃圾收集器 - 此可能也位于应用程序的末尾。

  

有没有办法在程序运行时检查活动对象的数量?

是的,您可以使用YourKit等分析器。

另见

答案 1 :(得分:1)

  

创建对象的最佳做法是什么?即;当我创建一个Object时,我也要确保在使用它后删除它。如果,如何删除它?

创建Object的最佳做法就是您想要使用它。

此外,您还需要了解变量范围。

  

如果我不删除该对象,该对象是否会在程序结束前撒谎?

不,GC会杀死未引用的对象

  

有没有办法在程序运行时检查活动对象的数量?

您可以使用任何Java分析工具,例如vesualVM

答案 2 :(得分:1)

Java是垃圾收集语言,因此,大多数内存管理和清理都是为您完成的。这与C ++等语言相反,人们必须手动释放未使用的内存,并且通常会对可能的内存泄漏更加谨慎。

解决您的具体问题:

  1. 有时,将“清空”未使用的对象引用视为好习惯。这通常仅在特定情况下才适用,例如,请参阅:Does setting Java objects to null do anything anymore?

  2. 不,不一定。如果没有任何内容指向内存中的Object,那么垃圾收集器应该释放未使用的内存。

  3. 您可以使用调试器来跟踪逐行执行代码时创建的对象数量(我不确定这是否足够强大,可以满足您的需求)。

答案 3 :(得分:0)

Java有垃圾收集器。垃圾收集器在不再使用时会销毁对象。 你可以在这里找到gc基础知识](http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html

如果要使用JDK打包的jvisualvm来分析应用程序。如果要以编程方式计算对象,请使用JMX API(读取有关JMX的oracle文档)

答案 4 :(得分:0)

JVM会自动回收不再使用的对象(这称为“垃圾回收”)。当它感觉像这样,并且当用完以前未分配的内存时,会发生这种情况,并将未使用的对象使用的内存返回到未分配的内存池。

您所要做的就是确保没有变量可以通过它来再使用对象 - 通常是通过分配另一个值 - 其余的自动发生。

查看程序使用了多少对象的最简单方法是使用分析器。您可以在JDK中使用visualvm或在Netbeans中免费使用。