我改进了代码以从垃圾回收器中获得更好的结果。
现在当我调用System.gc()
时,它确实释放了所有内存。但是当我没有调用System.gc()
时观察内存使用情况,应用程序确实会保留和使用越来越多的内存。
这是否意味着我的改进起作用了,我已经正确地处理了所有引用并且可以忽略JVM自行释放内存的方式?或者我的代码中存在其他问题,导致JVM在不执行垃圾回收的情况下保留更多的内存。
我改进了代码以从垃圾回收器中获得更好的结果。
现在当我调用System.gc()
时,它确实释放了所有内存。但是当我没有调用System.gc()
时观察内存使用情况,应用程序确实会保留和使用越来越多的内存。
这是否意味着我的改进起作用了,我已经正确地处理了所有引用并且可以忽略JVM自行释放内存的方式?或者我的代码中存在其他问题,导致JVM在不执行垃圾回收的情况下保留更多的内存。
未使用的内存是浪费的内存。
为什么要显式调用System.gc()
。在我看来,你应该永远不要调用它,而是让JVM决定何时运行GC。(如果你是一个初学者,JVM可以比你做出更好的决策。只有当你真正知道自己在做什么时才调用System.gc()
。)通常调用System.gc()
是一种不良实践。
System.gc()
只是向JVM发出运行GC的请求/提示。这并不意味着GC一定会运行。
在Java中可能存在内存泄漏,但在你的情况下这肯定不是需要关注的问题,因为正如你所提到的,当你调用System.gc()
时,你会看到一些内存得到释放。(所以你没有仍然持有未使用对象的引用,这可能会阻止GC清理这些对象。)
你为什么认为这是你代码的问题?可能是因为不再需要更多的内存,或者如果需要内存,你已经有了足够的内存(换言之,GC不会释放内存,因为程序还有很多东西要运行,那么GC为什么要清理内存呢?)。
System.gc()
仅是提示。由GC来管理内存(请注意,有各种类型的内存,例如堆、元空间、非堆)。每个GC算法都有多个可调参数,但都不会提供按需释放内存的选项。