我想知道程序运行时对象的使用时间和次数。我是否需要访问JVM堆栈,还是有另一种方法可以执行相同操作?
答案 0 :(得分:6)
您需要使用分析器来执行此操作。类似于YourKit或JProfiler或VisualVM。
答案 1 :(得分:1)
你是什么意思"一个物体被使用了多少次"?是它的构造函数被调用了多少次(其中一个)?或者它调用对象方法的次数是多少? 请澄清......
无论如何,有几种方法可以做到这一点。
您可以使用自己喜欢的个人资料工具,我认为您需要使用"跟踪" mode(执行检测的模式,而不是采样模式)。
如果重新编译该类是一个选项,则可以执行以下操作: 比方说,你有一些Foo和一些构造函数:
公共课Foo {
public Foo(int i){
// some constructor
}
public Foo(String s){ //另一个构造函数 }
}
说,你想知道你的构造函数被调用了多少次(也就是对象被创建了多少次)
因此,您可以使用静态数据成员,并在每次调用构造函数时增加计数。像这样:
public class Foo {
private static int count = 0;
public Foo(int i) {
// if we're here, the object is being created now:
count++;
.....
}
...
}
然后您可以获取堆快照(例如,使用位于JAVA_HOME / bin中的jmap) 生成的转储可以通过jhat或您最喜欢的探查器打开,您可以通过探索对象状态来查看。
当然,这种方法也适用于方法调用。 只要你的对象实际上由同一个类加载器创建它就可以工作。
3.如果您无法重新编译代码但仍不想使用分析器,则可以检测字节码以获得与2中相同的效果。您可以考虑在此处使用AspectJ等框架是很多其他人......
我认为剖析器是最快捷的方法 希望这有帮助