我的java应用程序在没有静态变量的情况下无法工作,我在应用程序中声明了大量的静态变量。但是,有一个问题:java中是否有任何解构函数可用于释放这些静态变量所使用的内存?
有一个Statement
变量,我可以使用close()
来释放一些内存。
我想知道,调用stmt.close()
方法时会发生什么?
PS:这可能是通过为对象(myStaticObject=null
)提供空值而调用System.gc()
来完成这项工作吗?
答案 0 :(得分:3)
如果你想释放静态字段x
的内存,那么是的,只需设置
x = null;
除非极少数情况下,您不必担心自己打电话给垃圾收集器:系统会为您做这件事,并且在适当的时候通常比您更了解。
所有这一切,一个包含大量静态字段的程序通常是一个警示标志,表明设计并不完全正确。好的设计通常(并非总是)将字段与实例相关联。您至少应该问自己是否应该重新构建代码。
答案 1 :(得分:3)
亲爱的AnkitNeo你自己给出了答案。
通过将变量设置为null并调用
System.gc();
你将释放记忆。但是,不保证System.gc()实际上会进行垃圾收集。根据这篇文章:When does System.gc() do anything大多数时候系统会垃圾收集。我相信如果当前CPU负载很高,它就不会GC。
答案 2 :(得分:1)
Java语言没有解构函数,因为它有自己的垃圾收集,这可以减轻程序员为不再引用的变量手动释放内存的速度。
stmt.close
将关闭Statement
对象使用的所有数据库资源。它不告诉垃圾收集器不再使用引用。
是的,您可以在关闭所有资源后调用一次System.gc()
(尽管这不能保证GC线程立即采取行动),并且在将null
分配给引用之后。但是,单独分配null
通常足以告诉GC线程在不需要显式运行GC的情况下不再引用该变量。
答案 3 :(得分:0)
您可以覆盖finalize()
方法。如果JVM收集了对象,它将被执行。但是,没有保证的方法来控制项目的收集。调用System.gc()
大部分时间都可以工作,具体取决于JVM的想法。
简而言之,您所说的内容大部分时间都可以使用。
希望这会对你有所帮助。