当前位置:编程学习 > JAVA >>

给定一个Classname,获取当前JVM中这个类的所有实例。Java做的到吗?

--------------------编程问答-------------------- 有意思,去研究一下 --------------------编程问答-------------------- 欢迎呀,项目中某个情景用到了。奇达大家讨论一下。
引用 1 楼 trocp 的回复:
有意思,去研究一下
--------------------编程问答-------------------- 版主大神,帮忙置个顶,这个问题要是研究出来,一定会方便很多人滴。 --------------------编程问答-------------------- 如果是自己的代码,比较容易搞定,简单计数就行
如果是用别人的类,可以增加一个工厂类,实例化的时候计数就行了
想在运行时动态获取,不清楚,期待中 --------------------编程问答-------------------- 呵呵,就是你说的第三种情况。需要远程监视服务器的JVM中对象的状况。效果就是不重启JVM,通过注入一段代码来收集信息,然后返回给测试机进行展示。注入部分已经OK了,就是遍历对象这个感觉挺难。
引用 4 楼 antineutrino 的回复:
如果是自己的代码,比较容易搞定,简单计数就行
如果是用别人的类,可以增加一个工厂类,实例化的时候计数就行了
想在运行时动态获取,不清楚,期待中
--------------------编程问答-------------------- 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以上运行 --------------------编程问答--------------------
引用 6 楼 chdw 的回复:
JDK 1.6以上是可以获取上面的信息的!

Java code

RuntimeMXBean bean = ManagementFactory.getRuntimeMXBean();
String name = bean.getName();
int index = name.indexOf('@');
String pid = name.substring(0, index);
//这……


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

引用 6 楼 chdw 的回复:
JDK 1.6以上是可以获取上面的信息的!

Java code
--------------------编程问答-------------------- tools.jar这个包,你是怎么学习的呢,有相关的API资料吗?我网上找了半天发现都没有。
引用 6 楼 chdw 的回复:
JDK 1.6以上是可以获取上面的信息的!
--------------------编程问答-------------------- 学习了 --------------------编程问答-------------------- 学习了。 --------------------编程问答-------------------- 找到了一些资料,不过是英文的,和大家共享一下吧。http://download.oracle.com/javase/6/docs/technotes/guides/visualvm/index.html

获取对象列表,继续讨论中。。。 --------------------编程问答-------------------- 别想了,不可能! --------------------编程问答-------------------- 学习了~ --------------------编程问答-------------------- 昨天仔细看了下,貌似heapHisto方法调用的也是C++编译好的一个Exe。java自己实现,难度太大了。等着吧,看看有没有牛人做到,时间到了再结贴。
引用 13 楼 bao110908 的回复:
别想了,不可能!
--------------------编程问答--------------------
引用 6 楼 chdw 的回复:
JDK 1.6以上是可以获取上面的信息的!

Java code

RuntimeMXBean bean = ManagementFactory.getRuntimeMXBean();
String name = bean.getName();
int index = name.indexOf('@');
String pid = name.substring(0, index);
//这……




引用 13 楼 bao110908 的回复:
别想了,不可能!



表示关注 --------------------编程问答-------------------- 这个问题,暂且搁置吧。那天大概看了一下tools.jar中VirtualMachine的代码,发现调用的也是c++编的exe。估计java获取句柄确实不好实现,希望大牛现身。 --------------------编程问答-------------------- jprofile中有个Memory Views,能统计所有的实例数;
Class Tracker能跟踪统计你想查看类的实例数;
TestProfiler是个自带的示例;

当然这个工具是个收费的。 --------------------编程问答--------------------
引用 6 楼 chdw 的回复:
JDK 1.6以上是可以获取上面的信息的!

Java code

RuntimeMXBean bean = ManagementFactory.getRuntimeMXBean();
String name = bean.getName();
int index = name.indexOf('@');
String pid = name.substring(0, index);
//这……

学习了 --------------------编程问答-------------------- 对,我用过这个工具,很强大!
引用 18 楼 lxbccsu 的回复:
jprofile中有个Memory Views,能统计所有的实例数;
Class Tracker能跟踪统计你想查看类的实例数;
TestProfiler是个自带的示例;

当然这个工具是个收费的。
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,