我是Java的新手,所以如果这是一个愚蠢的问题,那么请放轻松。
我刚刚开始使用Java几天前,我做的第一件事是为MySQL构建一个帮助器类。我正在使用DriverManager
连接到MySQL,它没有问题。我还有一个帮助类来关闭ResultSet
,Statement
和Connection
。这是它的片段。
this.result.close();
this.statement.close();
this.connection.close();
我单独关闭每个对象,并在完成后将它们设置为null
。
我担心的是,在测试中,我使用Runtime
来测试整个应用程序中的内存使用情况并关闭上述对象并将它们设置为null
似乎对显示的内存使用情况没有任何影响。 Runtime
。这是我确定内存使用情况的代码。
System.out.println("Memory Used: " + (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()));
我的问题是:为什么当我显示在对象仍然在范围内以及在程序结束时使用的内存时,内存似乎永远不会被释放?这是我的对象被关闭的方式的问题,还是使用的实际内存未被反映正确我认为它是Runtime
答案 0 :(得分:1)
将它们设置为null是不必要的。垃圾收集器比你更了解范围。
你最好关闭它们,但它们应该在单独包装的try / catch块中完成。如果第一个抛出异常,您将永远不会关闭其他人。
你太担心某些事情可能不重要了。我们不确定JVM是否会将释放的内存返回给操作系统,何时会发生,或者您的工具会检测到它。重要的是垃圾收集器正在正常工作。
这种方法本身不会杀死内存。您更有可能在代码中的其他位置发现问题。使用Visual VM进行分析以找到它们。