java对象的长度_什么决定Java对象大小?

这完全取决于实现,但是有一些因素会影响Java中的对象大小。

首先,Java对象中的字段的数量和类型明确地影响空间使用,因为您需要至少具有存储所有对象的字段所需的存储空间。但是,由于填充,对齐和指针压缩优化,没有直接公式可以用来精确计算这种方式使用了多少空间。

对于方法,通常说,对象中的方法数量对其大小没有影响。方法通常使用称为virtual function tables(或“vtables”)的功能来实现,这使得可以通过在恒定时间内的基类引用来调用方法。这些表通常通过跨越多个对象共享的vtable的单个实例来存储,然后使每个对象存储指向vtable的单个指针。

接口方法使这幅图复杂一点,因为有几种不同的实现可能。一个实现为每个接口添加一个新的vtable指针,因此实现的接口数量可能会影响对象大小,而另一些则不会。再次,它的实现依赖于事情如何实际放在一起在内存中,所以你不知道是否这将有一个内存成本。

据我所知,目前还没有JVM的实现,其中方法的长度影响对象的大小。通常,每个方法的仅一个副本存储在存储器中,然后该代码在特定对象的所有实例上共享。使用较长的方法可能需要更多的总内存,但不应影响类的实例的每个对象内存。也就是说,JVM规范没有承诺这是必须的,但我不能想到一个合理的实现,将花费额外的空间每个对象的方法代码。

除了字段和方法之外,许多其他因素可以有助于对象的大小。这里有几个:

根据JVM正在使用的垃圾收集器(或收集器)的类型,每个对象可能具有额外的存储空间来保存关于对象是活的,死的,可达的等的信息。这可以增加存储空间,但是它你的控制。在某些情况下,JVM可能通过尝试将对象存储在堆栈而不是堆上来优化对象大小。在这种情况下,对于某些类型的对象,开销甚至可能不存在。

如果使用同步,则对象可能会为其分配额外的空间,以便可以对其进行同步。 JVM的某些实现不会为对象创建一个监视器,除非有必要,因此如果不使用同步,最终可能会有更小的对象,但不能保证是这种情况。

此外,为了支持像instanceof和类型转储的操作符,每个对象可以具有保留用于保持类型信息的一些空间。通常,这与对象的vtable捆绑在一起,但不能保证这是真的。

如果使用断言,一些JVM实现将在类中创建一个包含是否启用断言的字段。这然后用于在运行时禁用或启用断言。同样,这是实现特定的,但它是好的记住。

如果你的类是一个非静态的内部类,它可能需要持有对包含它的类的引用,以便它可以访问它的字段。但是,如果你永远不会使用这个,JVM可能会优化这个。

如果使用匿名内部类,则该类可能需要保留额外的空间以容纳在其封闭范围中可见的最终变量,以便可以在类中引用它们。这是实现特定的,无论这些信息是复制到类字段还是只存储在本地堆栈,但它可以增加对象大小。

Object.hashCode()或System.identityHashCode(Object)的一些实现可能需要额外的信息存储在包含该哈希码的值的每个对象中,如果它不能以任何其他方式计算它(例如,如果对象可以在内存中重新定位)。这可能会增加每个对象的大小。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值