【问题标题】:Java - JDBC Memory Use After Closing All Objects [duplicate]Java - 关闭所有对象后使用的 JDBC 内存 [重复]
【发布时间】:2016-10-22 15:27:01
【问题描述】:

我是 Java 新手,所以如果这是一个愚蠢的问题,请放轻松。

几天前我刚开始使用 Java,我做的第一件事是为 MySQL 构建一个帮助类。我正在使用DriverManager 连接到 MySQL,它没有问题。我还有一个帮助类来关闭ResultSetStatementConnection。这是它的一个sn-p。

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

那样正确反映

【问题讨论】:

  • 这可能就像 Java 中的对象在 jvm 认为有必要之前不会被垃圾回收一样简单,即使您调用 system.gc()。您可能会尝试调用 gc() 作为测试的一部分,但这可能也不会这样做。当 jvm 进行垃圾收集时,您可能会重新研究。 IIRC 有很多因素会影响这一点。

标签: java mysql memory jdbc


【解决方案1】:

没有必要将它们设置为 null。垃圾收集器比你更了解范围。

你很好地关闭了它们,但它们应该在单独包装的 try/catch 块中完成。如果第一个抛出异常,您将永远不会关闭后面的其他。

您对某件不太重要的事情过于担心。不确定 JVM 是否会在何时将释放的内存返回给操作系统,或者您的工具是否会检测到它。重要的是垃圾收集器正常工作。

此方法不会自行杀死内存。您更有可能在代码的其他地方发现问题。继续使用 Visual VM 进行分析以找到它们。

【讨论】:

  • '你担心的事情可能并不重要。'您真的不认为程序结束时永远不会释放内存是一个问题吗?就像我说的,我是 Java 新手,但我只想彻底了解并从良好实践开始。还要感谢关于单个 try/catch 块的建议,我会立即实施!
  • 你不知道它没有被释放。根据操作系统看到已用内存上升与重新出现在堆上的释放内存之间存在差异。您是 Java 新手。你在想——这很好。我告诉你,你的恐惧是错误的。学习 Visual VM - 它与 /bin 文件夹中的 Oracle/Sun JVM 捆绑在一起。通过运行您的应用程序,您将了解很多。
  • 听起来对我来说是个好建议,谢谢!今天我将研究如何开始使用 Visual VM。
  • 再次感谢您的建议,已经从 VisualVM 获得了一些非常酷的结果!我已经可以看到这些对象确实有资格进行垃圾收集,应用程序根本没有运行足够的时间让 Java 对其采取行动。我猜相信 GC。
猜你喜欢
  • 2019-02-01
  • 1970-01-01
  • 2015-05-22
  • 1970-01-01
  • 1970-01-01
  • 2020-02-12
  • 2019-10-20
  • 2021-04-04
  • 1970-01-01
相关资源
最近更新 更多