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

Achilles_Dynasty 2011-11-01 10:16:05
如标题。不是想通过反射得到新对象,就是想获取已经存(生命周期未结束的对象)。
感兴趣的回一下,谢谢。
...全文
1060 20 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
fearlessMore 2012-02-12
  • 打赏
  • 举报
回复
对,我用过这个工具,很强大!
[Quote=引用 18 楼 lxbccsu 的回复:]

jprofile中有个Memory Views,能统计所有的实例数;
Class Tracker能跟踪统计你想查看类的实例数;
TestProfiler是个自带的示例;

当然这个工具是个收费的。
[/Quote]
Achilles_Dynasty 2011-11-07
  • 打赏
  • 举报
回复
这个问题,暂且搁置吧。那天大概看了一下tools.jar中VirtualMachine的代码,发现调用的也是c++编的exe。估计java获取句柄确实不好实现,希望大牛现身。
likgui 2011-11-07
  • 打赏
  • 举报
回复
[Quote=引用 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);
//这……
[/Quote]
学习了
lxbccsu 2011-11-07
  • 打赏
  • 举报
回复
jprofile中有个Memory Views,能统计所有的实例数;
Class Tracker能跟踪统计你想查看类的实例数;
TestProfiler是个自带的示例;

当然这个工具是个收费的。
oO临时工Oo 2011-11-02
  • 打赏
  • 举报
回复
[Quote=引用 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);
//这……
[/Quote]



[Quote=引用 13 楼 bao110908 的回复:]

别想了,不可能!
[/Quote]


表示关注
Achilles_Dynasty 2011-11-02
  • 打赏
  • 举报
回复
昨天仔细看了下,貌似heapHisto方法调用的也是C++编译好的一个Exe。java自己实现,难度太大了。等着吧,看看有没有牛人做到,时间到了再结贴。[Quote=引用 13 楼 bao110908 的回复:]
别想了,不可能!
[/Quote]
Antineutrino 2011-11-01
  • 打赏
  • 举报
回复
如果是自己的代码,比较容易搞定,简单计数就行
如果是用别人的类,可以增加一个工厂类,实例化的时候计数就行了
想在运行时动态获取,不清楚,期待中
Achilles_Dynasty 2011-11-01
  • 打赏
  • 举报
回复
版主大神,帮忙置个顶,这个问题要是研究出来,一定会方便很多人滴。
Achilles_Dynasty 2011-11-01
  • 打赏
  • 举报
回复
欢迎呀,项目中某个情景用到了。奇达大家讨论一下。[Quote=引用 1 楼 trocp 的回复:]

有意思,去研究一下
[/Quote]
oO临时工Oo 2011-11-01
  • 打赏
  • 举报
回复
有意思,去研究一下
24K純帥 2011-11-01
  • 打赏
  • 举报
回复
学习了~
  • 打赏
  • 举报
回复
别想了,不可能!
Achilles_Dynasty 2011-11-01
  • 打赏
  • 举报
回复
找到了一些资料,不过是英文的,和大家共享一下吧。http://download.oracle.com/javase/6/docs/technotes/guides/visualvm/index.html

获取对象列表,继续讨论中。。。
izard999 2011-11-01
  • 打赏
  • 举报
回复
学习了。
menglikanhua 2011-11-01
  • 打赏
  • 举报
回复
学习了
Achilles_Dynasty 2011-11-01
  • 打赏
  • 举报
回复
tools.jar这个包,你是怎么学习的呢,有相关的API资料吗?我网上找了半天发现都没有。[Quote=引用 6 楼 chdw 的回复:]

JDK 1.6以上是可以获取上面的信息的!

[/Quote]
Achilles_Dynasty 2011-11-01
  • 打赏
  • 举报
回复
这个确实挺给力呀,那请问有没有办法获取到对象的引用呢,通过数组、list或其他什么集合类存储都可以。

[Quote=引用 6 楼 chdw 的回复:]

JDK 1.6以上是可以获取上面的信息的!

Java code

[/Quote]
softroad 2011-11-01
  • 打赏
  • 举报
回复
[Quote=引用 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);
//这……
[/Quote]

学习了。
ChDw 2011-11-01
  • 打赏
  • 举报
回复
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以上运行
Achilles_Dynasty 2011-11-01
  • 打赏
  • 举报
回复
呵呵,就是你说的第三种情况。需要远程监视服务器的JVM中对象的状况。效果就是不重启JVM,通过注入一段代码来收集信息,然后返回给测试机进行展示。注入部分已经OK了,就是遍历对象这个感觉挺难。[Quote=引用 4 楼 antineutrino 的回复:]

如果是自己的代码,比较容易搞定,简单计数就行
如果是用别人的类,可以增加一个工厂类,实例化的时候计数就行了
想在运行时动态获取,不清楚,期待中
[/Quote]

62,633

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧