Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
创建java.time.LocalTime是否也会触发创建sun.util.calendar.ZoneInfo_Java_Heap Memory_Java Time_Localtime - Fatal编程技术网

创建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,就我所知它没有使用ZoneInfo
LocalTime。现在()
至少会触发加载
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;
}