最近有一个过程我们正在努力消耗比预期更多的内存。在检查堆时,创建了很多java.util.LocalTime
。这可以解释,因为我们将一些数据存储在时间图中,并以LocalTime
为关键。与预期相比,上游产生的数据可能太多了。
然而,令人惊讶的是,也创造了很多sun.util.calendar.ZoneInfo
。我们不使用这个类;它会由LocalTime
生成吗?但是,如果我们检查java.time.LocalTime
的源代码,我没有看到使用ZoneInfo
;有没有人对此有所了解?
很抱歉迟到的答案,但现在我找到了一些时间来检查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
也将加载。