有没有可能查看将被垃圾收集器删除的对象?我不需要对象的内容,但需要对象的类。
我正在尝试编写一个实时应用程序,它创建和删除大量对象,一段时间后应用程序变慢。目前我不确定是我的代码还是外部库的问题。因此,最完美的输出应该是识别所有已删除的类,以及它们的“计数”(删除了多少个这些对象)。
希望有人能帮助我。
最好的祝福, Michael
有没有可能查看将被垃圾收集器删除的对象?我不需要对象的内容,但需要对象的类。
我正在尝试编写一个实时应用程序,它创建和删除大量对象,一段时间后应用程序变慢。目前我不确定是我的代码还是外部库的问题。因此,最完美的输出应该是识别所有已删除的类,以及它们的“计数”(删除了多少个这些对象)。
希望有人能帮助我。
最好的祝福, Michael
finalize
方法,并在其中记录类的名称?但要注意,这可能会防止垃圾回收器对对象进行垃圾回收。public class MyObject {
@Override
public void finalize() throws Throwable {
logger.debug("Object of class {} being garbage collected", this.getClass().getName());
}
}
Object.finalize()
方法的签名和文档。/**
* Called by the garbage collector on an object when garbage collection
* determines that there are no more references to the object.
* A subclass overrides the <code>finalize</code> method to dispose of
* system resources or to perform other cleanup.
* <p>
* The general contract of <tt>finalize</tt> is that it is invoked
* if and when the Java<font size="-2"><sup>TM</sup></font> virtual
* machine has determined that there is no longer any
* means by which this object can be accessed by any thread that has
* not yet died, except as a result of an action taken by the
* finalization of some other object or class which is ready to be
* finalized. The <tt>finalize</tt> method may take any action, including
* making this object available again to other threads; the usual purpose
* of <tt>finalize</tt>, however, is to perform cleanup actions before
* the object is irrevocably discarded. For example, the finalize method
* for an object that represents an input/output connection might perform
* explicit I/O transactions to break the connection before the object is
* permanently discarded.
* <p>
* The <tt>finalize</tt> method of class <tt>Object</tt> performs no
* special action; it simply returns normally. Subclasses of
* <tt>Object</tt> may override this definition.
* <p>
* The Java programming language does not guarantee which thread will
* invoke the <tt>finalize</tt> method for any given object. It is
* guaranteed, however, that the thread that invokes finalize will not
* be holding any user-visible synchronization locks when finalize is
* invoked. If an uncaught exception is thrown by the finalize method,
* the exception is ignored and finalization of that object terminates.
* <p>
* After the <tt>finalize</tt> method has been invoked for an object, no
* further action is taken until the Java virtual machine has again
* determined that there is no longer any means by which this object can
* be accessed by any thread that has not yet died, including possible
* actions by other objects or classes which are ready to be finalized,
* at which point the object may be discarded.
* <p>
* The <tt>finalize</tt> method is never invoked more than once by a Java
* virtual machine for any given object.
* <p>
* Any exception thrown by the <code>finalize</code> method causes
* the finalization of this object to be halted, but is otherwise
* ignored.
*
* @throws Throwable the <code>Exception</code> raised by this method
*/
protected void finalize() throws Throwable { }
那些未被垃圾回收的对象难道不更有意思吗?
无论如何,像VisualVM这样的内存分析工具是你真正需要的。它可以精确地显示你的应用程序中每个类存在多少个对象,并且还可以通过比较垃圾收集前后的堆转储来识别已被垃圾回收的类和对象计数。