系统负载很高,查看线程发现同时出现大量BLOCK进程,
jstack线程后,发现BLOCK在TimeZone.getTimeZone方法上,
莫名其妙,搜索后,说它是synchronized方法。
点进源代码一看,我去,果然是。 ---------------------- 解决办法就是缓存一下吧,随便写写。 反正时区就那么几个,又不会变化。 升级后问题解决。
/** * 缓存时区. */ public static final ConcurrentHashMap<String,TimeZone> timeZoneMap = new ConcurrentHashMap<String,TimeZone>();
/** * 获取时区. * * @param timezone * 如UTC+7 * @return */ public static TimeZone getTimeZone(String timezone) {
timezone = timezone.replace("UTC", "GMT").replace("utc", "GMT");
// getTimeZone是同步方法,所以这里缓存一下 if (timeZoneMap.containsKey(timezone)) { return timeZoneMap.get(timezone); }
TimeZone zone = TimeZone.getTimeZone(timezone); timeZoneMap.put(timezone, zone); return zone; }
如getTimeZone("UTC+7")
|