JVM堆栈访问

时间:2012-01-24 06:29:19

标签: java jvm

我想知道程序运行时对象的使用时间和次数。我是否需要访问JVM堆栈,还是有另一种方法可以执行相同操作?

2 个答案:

答案 0 :(得分:6)

您需要使用分析器来执行此操作。类似于YourKit或JProfiler或VisualVM。

答案 1 :(得分:1)

你是什么意思"一个物体被使用了多少次"?是它的构造函数被调用了多少次(其中一个)?或者它调用对象方法的次数是多少? 请澄清......

无论如何,有几种方法可以做到这一点。

  1. 您可以使用自己喜欢的个人资料工具,我认为您需要使用"跟踪" mode(执行检测的模式,而不是采样模式)。

  2. 如果重新编译该类是一个选项,则可以执行以下操作: 比方说,你有一些Foo和一些构造函数:

    公共课Foo {

    public Foo(int i){

           // some constructor
    

    }

    public Foo(String s){           //另一个构造函数    }

    }

  3. 说,你想知道你的构造函数被调用了多少次(也就是对象被创建了多少次)

    因此,您可以使用静态数据成员,并在每次调用构造函数时增加计数。像这样:

    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等框架是很多其他人......

    我认为剖析器是最快捷的方法 希望这有帮助