java сборщик мусора - «получить» удаленные объекты - PullRequest
4 голосов
/ 19 января 2012

есть ли возможность увидеть, какие объекты будут удалены с помощью сборщика мусора? Мне не нужно содержимое объекта, но необходим класс объекта.

Я пытаюсь написать приложение в реальном времени, которое создает и удаляет множество объектов, и через некоторое время приложение замедляется. На данный момент я не уверен, является ли это проблемой моего кода или из внешних библиотек. Таким идеальным будет вывод, который идентифицирует все классы, которые были удалены, вместе с их «количеством» (сколько этих объектов было удалено).

Я надеюсь, что кто-нибудь может мне помочь.

Лучший, Michael

Ответы [ 5 ]

5 голосов
/ 19 января 2012

Вы можете попробовать контролировать ваше приложение с помощью VisualVM.Существует плагин, который дает информацию о деятельности сборщика мусора.

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

3 голосов
/ 19 января 2012

Как насчет переопределения метода 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 { }
2 голосов
/ 19 января 2012

Разве объекты, которые являются не собранным мусором, были бы еще более интересными?

Anway, профилировщик памяти типа VisualVM - это то, что вам действительно нужно. Он может точно показать, сколько объектов каждого класса существует в вашем приложении, а также может определить классы сборки мусора и количество объектов путем сравнения дампов кучи до и после GC.

1 голос
/ 19 января 2012

Поток для сборки мусора работает с низким приоритетом.Таким образом, этот поток не получает своей очереди на выполнение задачи очистки.

Также нет гарантии, что поток сборки мусора будет работать всегда.Здесь, в вашем приложении, поток с низким приоритетом сборки мусора не получает возможности выполнить над потоками приложения.Таким образом, куча не очищается от неиспользуемых объектов, и, следовательно, приложение замедляется из-за ограниченного размера кучи.

Вы можете подсчитать количество мусора объектов, собранных путем переопределения метода public void finalize().Проверьте javadoc для получения более подробной информации

Я бы порекомендовал вам использовать некоторые профилировщики Java для диагностики проблем с памятью.

1 голос
/ 19 января 2012

Я бы порекомендовал вам использовать любой из профилей Java, таких как JProfiler, Yourkit и т. Д. Очень легко увидеть количество собранных мусоров, а также тип объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...