Is there any sizeof-like method in Java?

后端 未结 15 989
暗喜
暗喜 2020-11-27 15:03

Is there any built-in method in Java to find the size of any datatype? Is there any way to find size?

相关标签:
15条回答
  • 2020-11-27 15:35

    As mentioned here, there are possibilities to get the size of primitive types through their wrappers.

    e.g. for a long this could be Long.SIZE / Byte.SIZE from java 1.5 (as mentioned by zeodtr already) or Long.BYTES as from java 8

    0 讨论(0)
  • 2020-11-27 15:35

    I decided to create an enum without following the standard Java conventions. Perhaps you like this.

    public enum sizeof {
        ;
        public static final int FLOAT = Float.SIZE / 8;
        public static final int INTEGER = Integer.SIZE / 8;
        public static final int DOUBLE = Double.SIZE / 8;
    }
    
    0 讨论(0)
  • 2020-11-27 15:40

    The Instrumentation class has a getObjectSize() method however, you shouldn't need to use it at runtime. The easiest way to examine memory usage is to use a profiler which is designed to help you track memory usage.

    0 讨论(0)
  • 2020-11-27 15:41

    No. There is no such method in the standard Java SE class library.

    The designers' view is that it is not needed in Java, since the language removes the need for an application1 to know about how much space needs to be reserved for a primitive value, an object or an array with a given number of elements.

    You might think that a sizeof operator would be useful for people that need to know how much space their data structures take. However you can also get this information and more, simply and reliably using a Java memory profiler, so there is no need for a sizeof method.


    Previous commenters made the point that sizeof(someType) would be more readable than 4. If you accept that readability argument, then the remedy is in your hands. Simply define a class like this ...

    public class PrimitiveSizes {
        public static int sizeof(byte b) { return 1; } 
        public static int sizeof(short s) { return 2; }
        // etcetera
    }
    

    ... and statically import it ...

    import static PrimitiveSizes.*;
    

    Or define some named constants; e.g.

    public static final int SIZE_OF_INT = 4;
    

    Or (Java 8 and later) use the Integer.BYTES constant, and so on.


    Why haven't the Java designers implemented this in standard libraries? My guess is that:

    • they don't think there is a need for it,
    • they don't think there is sufficient demand for it, and
    • they don't think it is worth the effort.

    There is also the issue that the next demand would be for a sizeof(Object o) method, which is fraught with technical difficulties.

    The key word in the above is "they"!


    1 - A programmer may need to know in order to design space efficient data structures. However, I can't imagine why that information would be needed in application code at runtime via a method call.

    0 讨论(0)
  • 2020-11-27 15:41

    The Java Native Access library is typically used for calling native shared libraries from Java. Within this library there exist methods for determining the size of Java objects:

    The getNativeSize(Class cls) method and its overloads will provide the size for most classes.

    Alternatively, if your classes inherit from JNA's Structure class the calculateSize(boolean force) method will be available.

    0 讨论(0)
  • 2020-11-27 15:41

    Try java.lang.Instrumentation.getObjectSize(Object). But please be aware that

    It returns an implementation-specific approximation of the amount of storage consumed by the specified object. The result may include some or all of the object's overhead, and thus is useful for comparison within an implementation but not between implementations. The estimate may change during a single invocation of the JVM.

    0 讨论(0)
提交回复
热议问题