Cod*_*nny 5 java multithreading garbage-collection memory-management finalize
所以,我最近在Java中发现了finalize方法(不知道为什么我之前错过了它,但它确实存在).这似乎可能是我正在处理的许多问题的答案,但我想首先获得更多信息.
在线,我发现这个图表说明了垃圾收集和完成的过程:

几个问题:
我想我应该解释为什么我感兴趣.我经常使用LWJGL,似乎如果我可以使用finalize来使Java对象自动清理OpenGL资源,那么我可以在API方面做一些非常好的事情.
当Java Garbage Collector检测到不存在对该特定对象的引用时,将调用finalize().finalize()由所有Java对象通过Object类继承.
据我所知,你可以毫无困难地从finalize()方法调用静态方法调用我可以从finalize()建立一个新的引用 - 但是我会说这是糟糕的编程实践.
你不应该依赖finalize()进行清理,最好随时清理.我更喜欢使用try,catch,最后清理,而不是使用finalize().特别是,通过使用finalize(),您将使JVM保留可终结对象引用的所有其他对象,以防它调用它们.这意味着您可能不需要使用内存.更重要的是,这也意味着您可以使JVM永远不会最终处置对象,因为它们必须保持它们,因为其他对象最终方法需要它,例如竞争条件.
另外,请考虑完全有可能不会调用GC.因此,您实际上无法保证将永远调用finalize().
在完成资源时清理资源,并且不依赖于finalize()来做它是我的建议.
我认为对于将使用什么线程没有任何保证。可以实例化新对象并且可以调用静态方法。建立对对象的新引用将阻止它被垃圾收集,但该finalize方法不会再次被调用——您不想这样做。
清理资源正是该finalize方法的用途,因此您应该擅长于此。不过,有一些警告:
该方法不保证被调用。 如果您占用了程序停止时不会自动释放的资源,则不要依赖finalize.
无法保证该方法何时被调用。由于内存紧张,这会更快。如果有大量可用内存,即使有的话也会晚一点。这可能很适合您:拥有大量内存,您可能不太关心释放资源。(尽管坚持使用它们可能会干扰同时运行的其他软件,在这种情况下您会担心。)
我通常的解决方案是使用某种处理方法来进行清理。如果可以的话,我会在某个时候明确地调用它,并且会尽快调用它。然后我添加一个仅调用dispose方法的 Finalize 方法。(请注意,当多次调用时,dispose方法必须表现良好!事实上,通过这种编程,我可能会在外部多次调用disposefinalize,不确定先前的调用是否成功,但希望尽快有效地调用它)现在,理想情况下,一旦我不再需要我的资源,它们就会被释放。但是,如果我失去了对资源对象的跟踪,finalize当内存不足并且我需要帮助时,该方法将帮助我摆脱困境。