время создания объекта из дампа кучи - PullRequest
2 голосов
/ 11 января 2012

Есть ли способ выяснить (даже приблизительно) время создания объекта из дампа кучи Java-процесса?

Пожалуйста, предположите, что у меня нет доступа к коду, и мне нужно работать сданная свалка.Поэтому я не могу пойти и поставить метку времени в конструкторе.

Ответы [ 4 ]

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

Я не думаю, что вы можете найти временную метку из данного дампа, но вот несколько советов, если вы можете создавать новые дампы.

Если вам нужно только очень грубое разрешение времени, например (после запуска,через 5 минут, перед ручным вызовом ошибки, после ручного запуска ошибки и т. д.), вы можете взять несколько дампов и сравнить их.

В противном случае, если вы сможете добавить агента и снова запустить сценарий, выможете зарегистрировать это самостоятельно.С вашим JDK в каталоге * $ JAVA_HOME / demo / jvmti * есть примерная агентская программа heapTracker , которая может отслеживать удаление созданных объектов.Это можно легко изменить, добавив также временную метку.См. Интерфейс инструментов

0 голосов
/ 11 января 2012

Вы можете создать TimerClass, который расширяется всеми классами в вашем приложении. Вы можете разместить атрибут таймера (который является экземпляром java.util.Date) в конструкторе TimerClass, который инициализируется при вызове конструктора. В любой момент времени, когда вы захотите узнать время создания объекта, вы можете вызвать таймер этого конкретного объекта. Поскольку все классы в вашем приложении будут наследоваться от этого TimerClass, они будут иметь доступ к атрибуту timer.

public class TimerClass{
    private Date timer;
    public TimerClass(){
        timer = new Date();
    }

    public getTimer(){
        return timer;
    }

}
0 голосов
/ 11 января 2012

Вы пытались использовать "Java Heap Analysis Tool" Посмотрите на него и выясните, соответствует ли он вашим требованиям.

http://docs.oracle.com/javase/6/docs/technotes/tools/share/jhat.html

0 голосов
/ 11 января 2012

Вы можете использовать

System.currentTimeMillis()

Сохраните его в длинном значении, прежде чем вы начнете создавать этот объект, и вызовите его снова после создания объекта.

Затем вычтите их, и у вас будет время, которое потребовалось.

ПРИМЕЧАНИЕ: Если вы хотите быть более точным, вы также можете использовать System.nanoTime(), который я в основном использую.

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