如何查找Java程序中堆上的活动对象数?如何查找堆中的对象数
回答
据我所知,你不能。你可以,但是,得到的内存用于程序的数量:
Runtime rt = Runtime.getRuntime();
System.out.println("Used: " + (rt.totalMemory() - rt.freeMemory());
System.out.println("Free: " + rt.freeMemory());
System.out.println("Total: " + rt.totalMemory());
如果使用某种Factory
类的,你可以找到堆中的对象的数量创建了所有对象。即使那样你也必须在finalize()
方法中有一些东西。当然,这不能用于所有物体,例如jdk库类不能被修改。但是,如果你想查找你创建的特定类的实例数量,你可能会发现。
如果我有像String a =“abc”; A = A + “DEF”; 你将如何跟踪工厂中的物体数量 – 2010-02-14 20:43:19
对于调试,您可以使用一个分析器(如YourKit,一个商业Java分析器)。您会发现java分析器的开源和商业变体。
为了与您的代码集成,您可以使用“面向方面编程”技术。 AOP框架(例如AspectWerkz)允许您在类加载时更改类文件。这将允许您修改构造函数以将对象注册到您的“所有我的运行时对象框架”中。
jmap是标准的java工具,您可以使用它来捕获堆转储和统计信息。我不能说jmap使用什么协议连接到JVM以获取此信息,并且不清楚这些信息是否可用于在JVM中直接运行的程序(尽管我确信该程序可以查询它的JVM通过一些套接字来获取这些信息)。 JVM TI是一个由C代码使用的工具接口,它有几乎完全的JVM访问权限,但它是C代码,不能被JVM直接使用。你也许可以编写一个C库,然后与它进行交互,但是没有任何东西可用。
有几个JMX MBean,但我不认为它们中的任何一个都提供实际的对象数。您可以从这些获得内存统计信息(这些是JConsole使用的)。查看java.lang.management类。
如果你想要一些快速(易于实现,不一定是jmap需要一些时间的快速结果),我将分离出一段jmap,然后简单地读取结果文件。
public class ObjectCount
{
static int i;
ObjectCount()
{
System.out.println(++i);
}
public static void main(String args[])
{
ObjectCount oc = new ObjectCount();
ObjectCount od = new ObjectCount();
ObjectCount oe = new ObjectCount();
ObjectCount of = new ObjectCount();
ObjectCount og = new ObjectCount();
}
}
public class NumOfObjects {
static int count=0;
{
count++;
}
public static void main(String[] args)
{
NumOfObjects no1=new NumOfObjects();
System.out.println("no1:" + count);//1
NumOfObjects no2=new NumOfObjects();
System.out.println("no2:"+ count); //2
for (int i=0; i<10;i++)
{
NumOfObjects noi=new NumOfObjects();
}
System.out.println("Total objects:"+count);// 12
}
}
class Test1
{
static int count=0;
public Test1()
{
count++;
System.out.println("Total Objects"+" "+count);
}
}
public class CountTotalNumberOfObjects
{
public static void main(String[] args)
{
Test1 t = new Test1();
Test1 t1 = new Test1();
Test1 t3 = new Test1();
Test1 t11 = new Test1();
Test1 t111 = new Test1();
Test1 t13 = new Test1();
}
}
最简单的方法是使用jmap
工具。如果您将在最后打印对象直方图,则会看到实例的总数以及所有对象的累计大小:
jmap -histo <PID>
将打印具有实例数量和大小的整个对象。最后一行将包含总数
Total 2802946 174459656
第二列是总实例数,而去年是总字节数。
- 1. EclipseLink期望在堆栈中查找对象/数组
- 2. 堆对象如何使用堆栈中的数据?
- 3. 查找json数组中的对象数
- 4. 如何查找数组对象的中位数?
- 5. 如何在内存中查找对象
- 6. 如何从java堆转储中找到缓存的对象
- 7. 在堆转储中查找具有相同值的对象
- 8. 如何查找Python中列表中的对象数量
- 9. 查找类对象数组中的值
- 10. 查找对象数组中的值
- 11. 查找NSMutableArray中的对象数
- 12. 查找数组中的对象
- 13. 如何在C#.Net中查看堆栈和堆栈中的对象
- 14. 查找C中的对象++
- 15. VisualVM:如何查找堆中对象的大小,包括它从其字段引用的所有对象?
- 16. 如何查找数组中另一个对象旁边的对象?
- 17. 如何查找某个类的对象
- 18. 如何查找EventSystem.current.IsPointerOverGameObject检测的对象?
- 19. 如何查找对象的属性?
- 20. 如何查找JSON对象的长度
- 21. 如何使用Jquery查找数组中的对象值?
- 22. 如何查找对象数组中的第二大元素
- 23. 如何查找网格中花对象的数量?
- 24. 如何查找Ruby中两个Date对象之间的天数?
- 25. 如何查找数组中的特定对象
- 26. 如何查找Mongoose中的对象数组?
- 27. 如何在SQL Server数据库中查找最大的对象?
- 28. 查找与对象数组
- 29. Ruby数组对象查找
- 30. 查找数组对象
由于什么原因,您需要知道活堆对象的数量?有机会有更好的方式去做你想做的事。 – 2010-02-14 20:23:49
你想从程序本身获取这些信息吗?或者使用调试工具? – 2017-12-21 04:17:12