给定一个Classname,获取当前JVM中这个类的所有实例。Java做的到吗? 本帖最后由 Achilles_Dynasty 于 2011-11-01 10:21:13 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 呵呵,就是你说的第三种情况。需要远程监视服务器的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是个自带的示例;当然这个工具是个收费的。 求简单贪吃蛇代码(注释详细),没积分下不到--!,谢谢 关于byte[]与String的问题 点图的分割问题 问题很简单 就是不知道怎么实现.... 刚才看张孝祥讲的内部类 我来这里求答案了 多线程从sina网采集股票实时数据 请问下载地址,急需!3x 请问现在企业一般性用什么java编译器???? 为什么在文件编译时,引入的类会自己不见了? 如何将java程序变成可以脱离jdk1.4环境的可执行文件 java写的仿雷电游戏 HttpExchange 如何处理cookies
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以上运行
Class Tracker能跟踪统计你想查看类的实例数;
TestProfiler是个自带的示例;当然这个工具是个收费的。