Как отследить создание любого объекта в Java, так как freeMemory () сообщает только о долгоживущих объектах? - PullRequest
1 голос
/ 21 марта 2012

Всякий раз, когда моя JVM создает новый объект, я хочу что-то напечатать в журнале. Я пытался обнаружить это с помощью Runtime.getRuntime (). FreeMemory (), но, к сожалению, он НЕ учитывает какой-либо недолговечный объект до тех пор, пока он не переведен в кучу ( проверьте здесь более подробную информацию ).

Так кто-нибудь знает, как обнаруживать / отслеживать каждый раз, когда объект создается / создается моей JVM? Чтобы сделать это проще, как мы можем выполнить код ниже:

Не стесняйтесь использовать MemoryPoolMXBean и JMX:

public class MemoryUtils {

    private static Set<String> set = new HashSet<String>();

    public static void main(String[] args) {

        // START

        // now create a bunch of objects and save them in the set
        for (int i = 0; i < 100; i++) {
            set.add(new String("foo" + i));
        }

        // FINISH

        // FIXME: Do something here to detect that a bunch of objects were created!

    }
}

Редактировать: Попробовать решение, предложенное Владимиром ниже:

Работает, но со странным побочным эффектом:

long t = totalThreadMemoryAllocated();

// did nothing

t = totalThreadMemoryAllocated() - t;

System.out.println(t); // ==> 48 !!!???

public static long totalThreadMemoryAllocated() {
    com.sun.management.ThreadMXBean tBean = (com.sun.management.ThreadMXBean) ManagementFactory.getThreadMXBean();
    return tBean.getThreadAllocatedBytes(Thread.currentThread().getId());
}

Но он ДЕЙСТВИТЕЛЬНО учитывает создание любого объекта, поэтому я думаю, что мог бы использовать это, если вычту из него магическое число 48.

Ответы [ 3 ]

4 голосов
/ 21 марта 2012

для этого можно использовать Java-агент, реализацию с открытым исходным кодом можно найти в блоге автора - http://jeremymanson.blogspot.co.uk/2012/02/update-to-allocation-instrumenter.html

3 голосов
/ 21 марта 2012

Sun JVM (1.6.0u26 и выше) имеет ThreadMXBean # getThreadAllocatedBytes метод, который сообщает общее количество байтов, выделенных потоком.Это не будет отличать живую / мертвую память, однако позволит вам обнаружить выделения памяти и измерить общий объем этих выделений.

Чтобы использовать этот подход, вы просто просматриваете обычный ThreadMXBean и приводите его к com.sun.management.ThreadMXBean или используйте отражение для вызова метода.

0 голосов
/ 29 ноября 2012

Я написал инструмент с открытым исходным кодом для отслеживания распределения объектов и времени жизни объектов: http://mchr3k.github.com/org.inmemprofiler/

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

...