覚えたら書く

IT関係のデベロッパとして日々覚えたことを書き残したいです。twitter: @yyoshikaw

日時オブジェクトのサイズをJOLで確認してみる

以前、JMHで現在日時取得のベンチマークを取得してみました。

今回は色々な日時オブジェクトのメモリサイズをJOLで確認してみます


対象

今回の測定対象とするクラスは以下です

  • java.util.Date
  • java.util.Calendar
  • java.time.LocalDateTime
  • java.time.LocalDate
  • java.time.LocalTime


メモリサイズ取得

以下のサンプルコードを実行してメモリサイズを取得してみました

■サンプルコード

import org.openjdk.jol.info.GraphLayout;


public class DateObjSize {
    private static java.util.Date utilDate = new java.util.Date();

    private static java.util.Calendar calendar = java.util.Calendar.getInstance();

    private static java.time.LocalDateTime localDateTime = java.time.LocalDateTime.now();

    private static java.time.LocalDate localDate = java.time.LocalDate.now();

    private static java.time.LocalTime localTime = java.time.LocalTime.now();

    public static void main(String[] args) {

        System.out.println("java.util.Date totalSize(byte) -> " + GraphLayout.parseInstance(utilDate).totalSize());
        System.out.println("java.util.Date footprint -> \n" + GraphLayout.parseInstance(utilDate).toFootprint());

        System.out.println("-------------");

        System.out.println("java.util.Calendar totalSize(byte) -> " + GraphLayout.parseInstance(calendar).totalSize());
        System.out.println("java.util.Calendar footprint -> \n" + GraphLayout.parseInstance(calendar).toFootprint());

        System.out.println("-------------");

        System.out.println("java.time.LocalDateTime totalSize(byte) -> " + GraphLayout.parseInstance(localDateTime).totalSize());
        System.out.println("java.time.LocalDateTime footprint -> \n" + GraphLayout.parseInstance(localDateTime).toFootprint());

        System.out.println("-------------");

        System.out.println("java.time.LocalDate totalSize(byte) -> " + GraphLayout.parseInstance(localDate).totalSize());
        System.out.println("java.time.LocalDate footprint -> \n" + GraphLayout.parseInstance(localDate).toFootprint());

        System.out.println("-------------");

        System.out.println("java.time.LocalTime totalSize(byte) -> " + GraphLayout.parseInstance(localTime).totalSize());
        System.out.println("java.time.LocalTime footprint -> \n" + GraphLayout.parseInstance(localTime).toFootprint());

    }
}


■実行結果

java.util.Date totalSize(byte) -> 24
java.util.Date footprint -> 
java.util.Date@aec6354d footprint:
     COUNT       AVG       SUM   DESCRIPTION
         1        24        24   java.util.Date
         1                  24   (total)


-------------
java.util.Calendar totalSize(byte) -> 712
java.util.Calendar footprint -> 
java.util.GregorianCalendar@58d25a40d footprint:
     COUNT       AVG       SUM   DESCRIPTION
         1        40        40   [C
         4        58       232   [I
         1        96        96   [J
         1        40        40   [Z
         1        24        24   java.lang.String
         1       112       112   java.util.GregorianCalendar
         1        16        16   sun.util.calendar.Gregorian
         1        96        96   sun.util.calendar.Gregorian$Date
         1        56        56   sun.util.calendar.ZoneInfo
        12                 712   (total)


-------------
java.time.LocalDateTime totalSize(byte) -> 72
java.time.LocalDateTime footprint -> 
java.time.LocalDateTime@1c4af82cd footprint:
     COUNT       AVG       SUM   DESCRIPTION
         1        24        24   java.time.LocalDate
         1        24        24   java.time.LocalDateTime
         1        24        24   java.time.LocalTime
         3                  72   (total)


-------------
java.time.LocalDate totalSize(byte) -> 24
java.time.LocalDate footprint -> 
java.time.LocalDate@7de26db8d footprint:
     COUNT       AVG       SUM   DESCRIPTION
         1        24        24   java.time.LocalDate
         1                  24   (total)


-------------
java.time.LocalTime totalSize(byte) -> 24
java.time.LocalTime footprint -> 
java.time.LocalTime@1175e2dbd footprint:
     COUNT       AVG       SUM   DESCRIPTION
         1        24        24   java.time.LocalTime
         1                  24   (total)


結果

表にまとめると以下の通りです

クラス メモリサイズ(byte)
java.util.Date 24
java.util.Calendar (java.util.GregorianCalendar) 712
java.time.LocalDateTime 72
java.time.LocalDate 24
java.time.LocalTime 24

クラスごとに特性があるので良い悪いと一概に言えませんが、Calendarのメモリサイズはかなり大きいことが分かります。



関連エントリ