以前、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のメモリサイズはかなり大きいことが分かります。