如何知道java中对象的大小

如何知道java中对象的大小,java,Java,这是一个面试问题,列表包含5个对象,如组织、员工、地址、国家等。如果不运行java代理,您如何知道哪个对象最重。有一个条件是Arraylist中的所有可用对象都不可序列化。基本上,面试官想知道如何编写代码,知道ArrayList中可用对象的大小,这样您就可以知道特定对象更重了。请提供我帮助。让我再次提出条件 您不能使用任何探查器工具 并非所有对象都可序列化 您可以通过java代理运行 您必须编写代码以作为普通java程序进行测试和运行。您可以使用instrumentation接口。 实际上你不可

这是一个面试问题,列表包含5个对象,如组织、员工、地址、国家等。如果不运行java代理,您如何知道哪个对象最重。有一个条件是Arraylist中的所有可用对象都不可序列化。基本上,面试官想知道如何编写代码,知道ArrayList中可用对象的大小,这样您就可以知道特定对象更重了。请提供我帮助。让我再次提出条件

  • 您不能使用任何探查器工具
  • 并非所有对象都可序列化
  • 您可以通过java代理运行

  • 您必须编写代码以作为普通java程序进行测试和运行。

    您可以使用instrumentation接口。

    实际上你不可能做到这一点。请记住,Java处理引用,您的列表将只包含对给定对象的引用。考虑:

    MyBigObject obj = new MyBigObject();
    
    List<MyBigObject> list1 = new ArrayList<MyBigObject>();
    list1.add(obj);
    
    MyBigObject obj=new MyBigObject();
    List list1=新的ArrayList();
    清单1.添加(obj);
    
    因此,您的列表包含对对象的引用。现在如果我这样做:

    List<MyBigObject> list2 = new ArrayList<MyBigObject>();
    list2.add(obj);
    
    List list2=new ArrayList();
    清单2.添加(obj);
    
    我的第二个列表包含对同一对象的引用。如果说
    list2
    实际上是“包含”对象的大小,那就没有意义了


    构造对象时,对象由基本体和参照组成。您可以考虑原语的大小(因为它们是按值复制的),但不能考虑引用对象的大小,因为它们只是指向其他对象的指针。您可以说一个对象有一定的大小,由引用(可能是32位或64位)组成,但这是另一回事。

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

    public static long memoryUsed() {
        return Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
    }
    
    long before = memoryUsed();
    new Object();
    long used = memoryUsed() - before; // 16 bytes.
    

    您还可以使用反射扫描每个对象的字段。您可以使用“不安全”来获取每个字段的偏移量,并估计对象的终点(包括对象对齐)

    这是一个绝对荒谬的问题,更不用说将这5个对象添加到同一个列表会让我想抛出。我会从“列表不包含对象,它包含引用”开始.@Malwaregeek arrayList也只包含引用。@emory:这么说吧,列表不能包含对象,因为Java不是这样工作的。特定列表实现可以包含(例如,通过数组间接地)引用。当你谈论涉及到的记忆时,明确这一区别非常重要。你能给我提供代码吗?@user2688934:查看你问题下评论中的链接或费尔南多留下的帖子。我想在阅读更多内容的基础上删除我的评论,但这似乎不是一个选项。如果没有构造函数,会发生什么?我的意思是,在我们使用.getInstance()的Singleton类型类的情况下?