-2

It was an interview question that a List contains 5 objects like Organisation, Employee, Address,Country etc. How will you know which object is the heaviest one without running through java agent. There is one condition that all the objects available inside Arraylist are not serializable. Basically interviewer wants know how to write code know the size of the objects available inside ArrayList so that you can now that a particular object is heavier. Please provide me help. Once again let me put the conditions once again.

  1. You can not use any profiler tool.
  2. All the objects are not serializable.
  3. You can run though java agent.

You have to write code to test and run as normal java program.

4

3 回答 3

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 位),但这是另一回事。

于 2013-08-20T16:51:04.607 回答
1

您可以使用仪表接口。 http://www.javapractices.com/topic/TopicAction.do?Id=83

于 2013-08-20T16:04:38.487 回答
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 获取每个字段的偏移量并估计对象的结束(包括对象对齐)

于 2013-08-20T17:46:25.140 回答