给定一个Classname,获取当前JVM中这个类的所有实例。Java做的到吗?
--------------------编程问答-------------------- 有意思,去研究一下 --------------------编程问答-------------------- 欢迎呀,项目中某个情景用到了。奇达大家讨论一下。 --------------------编程问答-------------------- 版主大神,帮忙置个顶,这个问题要是研究出来,一定会方便很多人滴。 --------------------编程问答-------------------- 如果是自己的代码,比较容易搞定,简单计数就行如果是用别人的类,可以增加一个工厂类,实例化的时候计数就行了
想在运行时动态获取,不清楚,期待中 --------------------编程问答-------------------- 呵呵,就是你说的第三种情况。需要远程监视服务器的JVM中对象的状况。效果就是不重启JVM,通过注入一段代码来收集信息,然后返回给测试机进行展示。注入部分已经OK了,就是遍历对象这个感觉挺难。 --------------------编程问答-------------------- 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以上运行 --------------------编程问答--------------------
学习了。 --------------------编程问答-------------------- 这个确实挺给力呀,那请问有没有办法获取到对象的引用呢,通过数组、list或其他什么集合类存储都可以。
--------------------编程问答-------------------- tools.jar这个包,你是怎么学习的呢,有相关的API资料吗?我网上找了半天发现都没有。 --------------------编程问答-------------------- 学习了 --------------------编程问答-------------------- 学习了。 --------------------编程问答-------------------- 找到了一些资料,不过是英文的,和大家共享一下吧。http://download.oracle.com/javase/6/docs/technotes/guides/visualvm/index.html
获取对象列表,继续讨论中。。。 --------------------编程问答-------------------- 别想了,不可能! --------------------编程问答-------------------- 学习了~ --------------------编程问答-------------------- 昨天仔细看了下,貌似heapHisto方法调用的也是C++编译好的一个Exe。java自己实现,难度太大了。等着吧,看看有没有牛人做到,时间到了再结贴。 --------------------编程问答--------------------
表示关注 --------------------编程问答-------------------- 这个问题,暂且搁置吧。那天大概看了一下tools.jar中VirtualMachine的代码,发现调用的也是c++编的exe。估计java获取句柄确实不好实现,希望大牛现身。 --------------------编程问答-------------------- jprofile中有个Memory Views,能统计所有的实例数;
Class Tracker能跟踪统计你想查看类的实例数;
TestProfiler是个自带的示例;
当然这个工具是个收费的。 --------------------编程问答--------------------
学习了 --------------------编程问答-------------------- 对,我用过这个工具,很强大!
补充:Java , Java SE