Будет ли создание java.time.LocalTime также вызвать создание sun.util.calendar.ZoneInfo

В последнее время происходит процесс, который требует больше памяти, чем ожидалось. После проверки кучи есть много java.util.LocalTime создано. Что можно объяснить, потому что мы храним некоторые данные во временной карте с LocalTime в качестве ключа. Вероятно, слишком много этих данных, сгенерированных из восходящего потока, по сравнению с ожидаемыми.

Тем не менее, есть удивление, что также много sun.util.calendar.ZoneInfo созданы. Мы не используем этот класс; будет ли это генерироваться LocalTime? Но если мы проверим исходный код java.time.LocalTimeЯ не вижу ZoneInfo используется; у кого-нибудь есть идеи по этому поводу?

1 ответ

Извините за поздний ответ, но теперь я нашел время для проверки JDK-источников.

Если вы позвоните LocalTime.now() затем java.time будет использовать системный часовой пояс (неявная зависимость).

public static LocalTime now() {
    return now(Clock.systemDefaultZone());
}

А потом Clock грузы ZoneId.systemDefault():

public static Clock systemDefaultZone() {
    return new SystemClock(ZoneId.systemDefault());
}

Наконец, класс java.util.TimeZone используется для поиска зоны по умолчанию.

public static ZoneId systemDefault() {
    return TimeZone.getDefault().toZoneId();
}

И если вы посмотрите на источник TimeZone.getDefault() тогда вы увидите на некоторой глубине стека:

private static TimeZone getTimeZone(String ID, boolean fallback) {
    TimeZone tz = ZoneInfo.getTimeZone(ID);
    if (tz == null) {
        tz = parseCustomTimeZone(ID);
        if (tz == null && fallback) {
            tz = new ZoneInfo(GMT_ID, 0);
        }
    }
    return tz;
}

Вуаля, класс sun.util.calendar.ZoneInfo будет загружен тоже.

Другие вопросы по тегам