创建java.time.LocalTime也会触发sun.util.calendar.ZoneInfo的创建

问题描述 投票:1回答:1

最近有一个过程我们正在努力消耗比预期更多的内存。在检查堆时,创建了很多java.util.LocalTime。这可以解释,因为我们将一些数据存储在时间图中,并以LocalTime为关键。与预期相比,上游产生的数据可能太多了。

然而,令人惊讶的是,也创造了很多sun.util.calendar.ZoneInfo。我们不使用这个类;它会由LocalTime生成吗?但是,如果我们检查java.time.LocalTime的源代码,我没有看到使用ZoneInfo;有没有人对此有所了解?

java heap-memory java-time localtime
1个回答
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;
}

Voilá,班级sun.util.calendar.ZoneInfo也将加载。

© www.soinside.com 2019 - 2024. All rights reserved.