本帖最后由 Achilles_Dynasty 于 2011-11-01 10:21:13 编辑

解决方案 »

  1.   

    呵呵,就是你说的第三种情况。需要远程监视服务器的JVM中对象的状况。效果就是不重启JVM,通过注入一段代码来收集信息,然后返回给测试机进行展示。注入部分已经OK了,就是遍历对象这个感觉挺难。
      

  2.   

    JDK 1.6以上是可以获取上面的信息的!
    RuntimeMXBean bean = ManagementFactory.getRuntimeMXBean();
    String name = bean.getName();
    int index = name.indexOf('@');
    String pid = name.substring(0, index);
    //这里要区分操作系统
    HotSpotVirtualMachine machine = (HotSpotVirtualMachine) new sun.tools.attach.WindowsAttachProvider().attachVirtualMachine(pid);
    InputStream is = machine.heapHisto("-all");ByteArrayOutputStream baos = new ByteArrayOutputStream();
    int readed;
    byte[] buff = new byte[1024];
    while((readed = is.read(buff)) > 0)
        os.write(buff, 0, readed);
    is.close();machine.detach();
    System.out.println(os);它会生成: num #instances #bytes class name
    ----------------------------------------------
      1: 3981 651584 [C
      2: 479 326304 [B
      3: 1196 321488 <symbolKlass>
      4: 48 79384 [I
      5: 2580 61920 java.lang.String
      6: 340 40232 <constMethodKlass>
      7: 340 27536 <methodKlass>
    这样的格式,说明不同Class的实例数、占用内存等
    上面代码必须引用tools.jar,必须是Sun的 JDK 1.6以上运行
      

  3.   

    这个确实挺给力呀,那请问有没有办法获取到对象的引用呢,通过数组、list或其他什么集合类存储都可以。
      

  4.   

    tools.jar这个包,你是怎么学习的呢,有相关的API资料吗?我网上找了半天发现都没有。
      

  5.   

    找到了一些资料,不过是英文的,和大家共享一下吧。http://download.oracle.com/javase/6/docs/technotes/guides/visualvm/index.html获取对象列表,继续讨论中
      

  6.   

    昨天仔细看了下,貌似heapHisto方法调用的也是C++编译好的一个Exe。java自己实现,难度太大了。等着吧,看看有没有牛人做到,时间到了再结贴。
      

  7.   

    这个问题,暂且搁置吧。那天大概看了一下tools.jar中VirtualMachine的代码,发现调用的也是c++编的exe。估计java获取句柄确实不好实现,希望大牛现身。
      

  8.   

    jprofile中有个Memory Views,能统计所有的实例数;
    Class Tracker能跟踪统计你想查看类的实例数;
    TestProfiler是个自带的示例;当然这个工具是个收费的。