SizeOf an object? Why so hard?
Roger Riggs
Roger.Riggs at oracle.com
Fri Jun 21 19:20:01 UTC 2019
Hi David,
What is the use case? What are you trying to optimize?
Thanks, Roger
On 6/19/19 10:10 PM, David Ryan wrote:
> I'm in the process of moving a project from Java 8 to Java 11 and I've hit
> a stumbling block on what I thought should be a rather simple problem.
> During runtime, how do I get the size of an object in memory? Here are the
> methods I've found so far:
>
> 1. The Unsafe way.
>
> Use sun.misc.Unsafe to get the declared fields and find the field with the
> largest objectFieldOffset. Use the sun.arch.data.model to calculate the
> machine word (WORD = NR_BITS/8) size. Return ((maxOffset / WORD ) +1 ) *
> WORD. This is reasonably accurate but obviously not friendly in Java 11.
> Found on Stackoverflow [1].
>
> 2. Use java.lang.instrument.Instrumentation
>
> Been around for a long time [2]. However, this requires configuring
> special manifests for the project. Not very friendly for application
> deployment, etc.
>
> 3. Use before/after memory consumption
>
> Also mentioned in various stack overflow responses is the idea of calling
> the garbage collector and memory usage before and after allocating and
> using the difference for the size. I suppose this had the advantage of
> providing a deeper estimate of the object. However, with other threads
> doing work in the background this is mostly luck that we get the right
> answer.
>
> 4. Add up the base types.
>
> Also observed, investigate the types of each field and estimate the size of
> the object based on the size of an arbitrary header length plus sizes for
> each boolean, int, long, reference, etc. This misses padding added by the
> JVM, so not as accurate as using UNSAFE in 1.
>
>
> A few questions:
> Is there another method I've missed?
> Have I missed an obvious method that has been added in Java 11+?
> Is there any plans to add anything in a future release?
>
>
> [1]
> https://stackoverflow.com/questions/9368764/calculate-size-of-object-in-java
> [2]
> https://amitstechblog.wordpress.com/2011/05/19/estimating-the-memory-usage-of-a-java-object/
More information about the core-libs-dev
mailing list