简体   繁体   English

java垃圾收集器 - “获取”已删除的对象

[英]java garbage collector - “get” the deleted objects

is there a possibility to see which objects will be removed with the garbage collector? 是否有可能看到哪些对象将被垃圾收集器删除? I do not need the content of the object, but the class of the object is necessary. 我不需要对象的内容,但是对象的类是必要的。

I try to write a real time application, which creates and deletes a lot of objects and after a while the application slow down. 我尝试编写一个实时应用程序,它创建并删除了很多对象,一段时间后应用程序运行速度变慢。 At the moment I'm not sure whether it's a problem of my code or from the external libraries. 目前我不确定这是我的代码还是外部库的问题。 So perfect would be an output, which identifies all classes, which has been removed, together with their "count" (how many of this objects has been removed). 如此完美将是一个输出,它标识所有已被删除的类,以及它们的“计数”(已删除了多少这些对象)。

I hope somebody can help me. 我希望有人可以帮助我。

Best, Michael 最好,迈克尔

You could try monitoring your application with VisualVM. 您可以尝试使用VisualVM监视您的应用程序。 There is a plugin that gives info on the garbage collector activity. 有一个插件提供有关垃圾收集器活动的信息。

http://visualvm.java.net/plugins.html http://visualvm.java.net/plugins.html

How about overriding the finalize method for your objects and logging the name of the class there? 如何覆盖对象的finalize方法并在那里记录类的名称? Beware though, this might prevent the object from being garbage collected. 请注意,这可能会阻止对象被垃圾回收。

Your class might look something like this: 你的课可能看起来像这样:

public class MyObject {

    @Override
    public void finalize() throws Throwable {
        logger.debug("Object of class {} being garbage collected", this.getClass().getName());
    }
}

Here is the Object.finalize() method signature and documentation. 这是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 { }

Wouldn't the objects that are not garbage collected be even more interesting? 不是垃圾收集的对象会不会更有趣?

Anway, a memory profiler like VisualVM is what you really need. Anway,像VisualVM这样的内存分析器是你真正需要的。 It can show you exactly how many objects of each class exist in your application, and it can also identify garbage collected classes and object county by comparing heap dumps before and after GC. 它可以准确显示应用程序中每个类的对象数量,还可以通过比较GC之前和之后的堆转储来识别垃圾收集类和对象县。

我建议你使用任何java profilers,如JProfiler,Yourkit等。很容易看到垃圾收集的对象数量以及对象的类型。

The thread for garbage collection runs on low priority. 垃圾收集的线程以低优先级运行。 So this thread is not getting its turn to do the cleanup task. 所以这个线程没有轮到做清理任务了。

Also there is not guarantee that the garbage collection thread will run always. 此外,不保证垃圾收集线程将始终运行。 Here in your application the low priority thread of garbage collection is not getting chance to execute over the application threads. 在您的应用程序中,垃圾收集的低优先级线程无法通过应用程序线程执行。 So the heap is not getting cleared from unused objects and hence application slows down due to limited heap size. 因此堆不会从未使用的对象中清除,因此应用程序因堆大小有限而变慢。

You can count the number of objects garbage collected by overriding public void finalize() method. 您可以通过重写public void finalize()方法来计算垃圾回收的对象数。 Check javadoc for more details 检查javadoc以获取更多详细信息

I would recommend you to use some java profilers to diagnose memory issue. 我建议你使用一些java分析器来诊断内存问题。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM