创建java.time.LocalTime是否也会触发创建sun.util.calendar.ZoneInfo
最近有一个过程,我们正在努力获取比预期多得多的内存。在检查堆时,会创建大量创建java.time.LocalTime是否也会触发创建sun.util.calendar.ZoneInfo,java,heap-memory,java-time,localtime,Java,Heap Memory,Java Time,Localtime,最近有一个过程,我们正在努力获取比预期多得多的内存。在检查堆时,会创建大量java.util.LocalTime。这是可以解释的,因为我们确实将一些数据存储在带有LocalTime键的时间映射中。与预期相比,上游产生的数据可能太多了 然而,令人惊讶的是,还创建了许多sun.util.calendar.ZoneInfo。我们不使用这个类;它将由LocalTime生成吗?但是如果我们检查java.time.LocalTime的源代码,我看不到使用了ZoneInfo;有人对此有想法吗?很抱歉回答得太晚
java.util.LocalTime
。这是可以解释的,因为我们确实将一些数据存储在带有LocalTime
键的时间映射中。与预期相比,上游产生的数据可能太多了
然而,令人惊讶的是,还创建了许多
sun.util.calendar.ZoneInfo
。我们不使用这个类;它将由LocalTime
生成吗?但是如果我们检查java.time.LocalTime
的源代码,我看不到使用了ZoneInfo
;有人对此有想法吗?很抱歉回答得太晚,但现在我已经抽出时间来查看JDK源代码
如果调用LocalTime.now()
则java.time
将使用系统时区(隐式依赖项)
然后Clock
加载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
也将被加载。这毫无意义ZoneInfo
由java.util.Calendar
及其子类GregoriaCalendar
使用。我不知道它是否也被一些java.time
类使用过,我猜不会。如果您仍然怀疑LocalTime
,可以尝试在测试程序中生成大量LocalTime
对象,查看堆中是否出现ZoneInfo
对象。是否调用LocalTime.now(…)
?是的,我确实调用了LocalTime.now(),我确实看到它使用了ZoneOffset,但如果我查看ZoneOffset,就我所知它没有使用ZoneInfoLocalTime。现在()
至少会触发加载ZoneId
-类和时区数据。这也可能触发加载基于背景中相同tz数据(未测试)的ZoneInfo
。@OleV.V。这是有意义的,因为Oracle希望a)保持向后兼容性(保留旧时区相关类),b)希望通过将所有旧的和新的时区类放在后台(就系统tz而言)来最小化维护工作。是的,事实上我已经查看了源代码,但它看起来应该得到一个时区的缓存副本,而不是每次都查找。也许是JDK中的一个bug?无论如何,最好不要使用LocalTime.now()而使用LocalTime.now(时钟)
public static ZoneId systemDefault() {
return TimeZone.getDefault().toZoneId();
}
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;
}