当前位置: 首页 > 面试题库 >

Java对象的sizeof

燕涵容
2023-03-14
问题内容

我们如何找出Java对象的大小?

例:

class Person{
    String name;  
    int age;

    public Person(String n, int a){  
        name = n;  
        age = a;  
    }
}

Person person = new Person("Andy", 30);

现在我怎么知道人对象的大小?

谢谢


问题答案:

这个问题是没有意义的,至少没有没有进一步的背景。

Java中的“大小”概念仅针对基元进行了合理定义:一个字节为8位(毫不奇怪),一个字节int为32位,long64位,等等(请参见例如http://download.oracle.com/javase/tutorial
/java/nutsandbolts/datatypes.html
以获得完整列表)。

对于对象实例,它更加复杂,因为:

  • 对象实例可以(并且通常会)在内部包含对其他实例的引用,因此您必须决定是否计算这些从属实例,以及如何计算。如果多个实例共享一个依赖关系怎么办?
  • 有时,对象实例可能会被重用(例如的Interning java.lang.String,请参阅http://en.wikipedia.org/wiki/String_interning)。因此,如果使用大小为y的x个对象,则总大小可能小于x * y
  • JVM在如何内部实现对象和实例方面有很多余地。它可能对不同的实例使用不同的技术(例如,共享内部数据结构),因此甚至可能没有有意义的“大小”可分配给单个对象。

也许您可以解释为什么对对象大小感兴趣。

估算实例使用的堆内存有一些经验法则(例如,在Sun JVM中,一个java.lang.Object实例使用8字节),但是这些将取决于您使用的JVM。

通常,如果您想了解堆的使用情况,请使用内存/堆分析器。

编辑:

好的,(从JDK
6开始)有一种方法可以近似 估算对象使用的内存量: http
//download.oracle.com/javase/6/docs/api/java/lang/instrument/
Instrumentation.html#getObjectSize%28java.lang.Object%29

仍然只是一个近似值…



 类似资料:
  • 问题内容: 我正在自学Java,这本书中的其中一项复习练习要求“对象”和“对象变量”之间的区别。 我知道什么是对象(类的特定实例),但是我似乎无法在书中的任何地方(无答案部分)或在互联网上找到术语“对象变量”。 有人知道这个名词的意思吗? 问题答案: 它是“实例变量”的同义词: 显然,该术语并不常用,最好坚持使用“实例变量”以避免任何潜在的歧义。

  • 问题内容: 维护一个经常使用的对象的池并从池中获取一个而不创建一个新对象的优点和缺点是什么。类似于字符串实习,只是所有类对象都可以使用。 例如,由于节省了gc时间和对象创建时间,因此可以认为它很好。另一方面,如果从多个线程中使用它,则可能是一个同步瓶颈,需要进行显式释放,并可能导致内存泄漏。通过占用可以回收的内存,它对垃圾收集器施加了额外的压力。 问题答案: 除非创建对象昂贵,否则我不会打扰。 好

  • 问题内容: 我对Json并不陌生,我的目标是从Java bean创建下面的Json输出。我应该如何构造Java对象?我应该将MyResult类以及User和Result作为子类吗?我可以为此使用什么Json库? 问题答案: 注意: 我是 EclipseLink JAXB(MOXy)的 负责人,并且是 JAXB(JSR-222) 专家组的成员。 我应该如何构造Java对象? 下面是您的对象模型的外观

  • 对象使用完之后需要对其进行清除。对象的清除是指释放对象占用的内存。在创建对象时,用户必须使用 new 操作符为对象分配内存。不过, 在清除对象时,由系统自动进行内存回收,不需要用户额外处理。这也是 Java 语言的一大特色,某种程度上方便了程序员对内存的管理。 Java 语言的内存自动回收称为 垃圾回收(Garbage Collection)机制,简称 GC。垃圾回收机制是指 JVM 用于释放那些

  • 主要内容:显式创建对象,隐含创建对象对象是对类的实例化。对象具有状态和行为,变量用来表明对象的状态,方法表明对象所具有的行为。 Java 对象的生命周期包括创建、使用和清除,本文详细介绍对象的创建,在 Java 语言中创建对象分显式创建与隐含创建两种情况。 显式创建对象 对象的显式创建方式有 4 种。 1. 使用 new 关键字创建对象 这是常用的创建对象的方法,语法格式如下: 2. 调用 java.lang.Class 或者 ja

  • 问题内容: 我对JNI相对较新,并且掌握了使用JNI处理Java对象中的整数和数组的基本知识。现在,我正在尝试修改/访问Java对象中的Java对象。 我一直在互联网和Stack Overflow上进行搜索,但还没有找到执行该操作的方法。 这是例子。 在Java中: 在JNI中,如何通过ObjectTwo从ObjectOne访问“ buff”?我尝试过这样的事情… 我做错了什么吗? 问题答案: 在