Tomcat挂起调用TimeZone

时间:2012-08-31 12:48:50

标签: java timezone timezone-offset

我有这个问题正在降低生产。在AWS / Ubuntu / Tomcat堆栈中,运行Tomcat的CPU跳转到100%,当我得到一个线程转储时,这一段代码不断被阻塞在同一个地方。 (所有其他人都被锁定并等待。)

"TP-Processor6" daemon prio=10 tid=0x0000000041ec2800 nid=0x41c4 runnable [0x00007f70194b5000]
  java.lang.Thread.State: RUNNABLE
    at sun.util.calendar.ZoneInfo.getTransitionIndex(ZoneInfo.java:322)
    at sun.util.calendar.ZoneInfo.getOffsets(ZoneInfo.java:248)
    at sun.util.calendar.ZoneInfo.getOffsets(ZoneInfo.java:225)
    at java.util.GregorianCalendar.computeFields(GregorianCalendar.java:2024)
    at java.util.GregorianCalendar.computeFields(GregorianCalendar.java:1996)
    at java.util.Calendar.setTimeInMillis(Calendar.java:1109)
    at java.util.GregorianCalendar.<init>(GregorianCalendar.java:576)
    at java.util.Calendar.createCalendar(Calendar.java:1011)
    at java.util.Calendar.getInstance(Calendar.java:948)
    at com.xxx.core.util.DateUtil.modifyDate(DateUtil.java:385)
    at com.xxx.core.util.DateUtil.getDayDate(DateUtil.java:563)
    at com.xxx.core.util.DateUtil.getDayDate(DateUtil.java:573)
    at com.xxx.core.util.DateUtil.getDayDate(DateUtil.java:569)
    at com.xxx.core.util.DateUtil.splitByDays(DateUtil.java:496)
    at com.xxx.core.util.DateUtil.splitDateIntervalByIntervals(DateUtil.java:474)
    at com.xxx.core.util.DateUtil.splitDateIntervalByIntervals(DateUtil.java:436)

1 个答案:

答案 0 :(得分:1)

包装更好的日志记录,以弄清楚这里发生了什么。

确保您的实例指定了正确的编码和Locale - 系统,tomcat容器,应用程序。以GMT为标准,尝试:

Calendar.getInstance ("GMT-0", Locale.US); // verify inputs

如果您要获取日历的实例,为什么要明确重新设置日期?为什么不创建一个新的日历?然后,您将实例化一个新日历:

Calendar cal = new Calendar (TimeZone zone, Locale aLocale); // new 
cal.setTimeZone("GMT-0"); 
cal.setTimeInMillis(System.currentTimeMillis ()); 

日历和日期对象在Java中相对具有可塑性,因此您可以更改它们的运行方式。我猜测在环境变量或容器中可能存在未设置的内容,例如Local或编码与Calendar实例尝试的内容冲突。尝试明确指定一切。

这是我最好的直觉。