如何知道java中对象的大小

时间:2013-08-20 15:59:52

标签: java

这是一个面试问题,List包含5个对象,如Organization,Employee,Address,Country等。如果没有运行java代理,你怎么知道哪个对象是最重的对象。有一个条件是Arraylist中可用的所有对象都不可序列化。基本上,面试官想知道如何编写代码知道ArrayList中可用对象的大小,这样你就可以现在特定对象更重了。请帮我。再次让我再次提出条件。

  1. 您无法使用任何分析器工具。
  2. 所有对象都不可序列化。
  3. 您可以运行java代理。
  4. 你必须编写代码来测试和运行普通的java程序。

3 个答案:

答案 0 :(得分:1)

答案 1 :(得分:1)

你几乎无法做到这一点。请记住,Java处理引用,您的列表将只包含对给定对象的引用。考虑:

MyBigObject obj = new MyBigObject();

List<MyBigObject> list1 = new ArrayList<MyBigObject>();
list1.add(obj);

因此,您的列表包含对象的引用。现在,如果我这样做:

List<MyBigObject> list2 = new ArrayList<MyBigObject>();
list2.add(obj);

我的第二个列表包含一个引用,同一个对象。要说list2实际上是'包含'对象的大小是没有意义的。

构造对象时,它们由基元和引用组成。您可以考虑基元的大小(因为它们是按值复制的),但是您不能对引用对象执行此操作,因为它们只是指向其他对象的指针。你可以说一个对象是一定的大小,由引用组成(可能是32位或64位),但这是另一回事。

答案 2 :(得分:0)

通过在命令行上执行-XX:-UseTLAB并使用此方法,您可以看到分配对象需要多少空间

public static long memoryUsed() {
    return Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
}

long before = memoryUsed();
new Object();
long used = memoryUsed() - before; // 16 bytes.

您还可以使用反射来扫描每个对象的字段。您可以使用Unsafe来获取每个字段的偏移量并估计对象的结束(包括对象对齐)