繁体   English   中英

堆转储中的对象创建时间

[英]object creation time from heap dump

有没有办法从Java进程的堆转储中弄清(甚至近似)对象的创建时间?

请假设我无权访问代码,并且必须使用给定的转储。 所以我不能将时间戳记放入构造函数中。

我认为您无法从给定的转储中找到时间戳记,但是如果您可以进行新的转储,这里有一些建议。

如果您只需要非常粗略的时间分辨率,例如(启动后,5分钟后,手动触发错误之前,手动触发错误之后等),则可以进行几次转储并进行比较。

否则,如果您能够添加代理并再次运行该方案,则可以自己进行记录。 将您的JDK放在* $ JAVA_HOME / demo / jvmti目录*中时,有一个示例代理程序heapTracker可以跟踪对象创建的删除。 可以很容易地将其修改为也包括时间戳。 请参阅工具界面

你可以用

System.currentTimeMillis()

在开始创建该对象之前将其存储为长值,然后在创建该对象之后再次调用它。

然后,将两者相减,您将获得所需的时间。

注意:如果要更精确,也可以使用System.nanoTime() ,这是我System.nanoTime()使用的。

您可以创建一个TimerClass,并由应用程序中的所有类扩展。 您可以在TimerClass的构造函数中放置一个timer属性(它是java.util.Date的一个实例),该属性在调用构造函数时进行初始化。 无论何时,只要您想知道对象的创建时间,都可以调用该特定对象的计时器。 由于应用程序中的所有类都将从该TimerClass继承,因此它们将有权访问timer属性。

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

    public getTimer(){
        return timer;
    }

}

您是否尝试过使用“ Java堆分析工具”进行查看,并确定它是否满足您的要求。

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

暂无
暂无

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

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