这是一个面试问题,List包含5个对象,如Organization,Employee,Address,Country等。如果没有运行java代理,你怎么知道哪个对象是最重的对象。有一个条件是Arraylist中可用的所有对象都不可序列化。基本上,面试官想知道如何编写代码知道ArrayList中可用对象的大小,这样你就可以现在特定对象更重了。请帮我。再次让我再次提出条件。
你必须编写代码来测试和运行普通的java程序。
答案 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来获取每个字段的偏移量并估计对象的结束(包括对象对齐)