有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Tomcat挂起调用时区

我有一个问题导致生产下降。在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) 个答案

  1. # 1 楼答案

    总结一些更好的日志来了解这里发生了什么

    确保您的实例指定了正确的编码和区域设置系统、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中是相对可伸缩的,所以您可以更改它们的功能。我猜环境变量或容器中可能有一些设置不正确的地方,例如本地或编码,这与日历实例尝试的内容相冲突。尝试显式地指定所有内容

    这是我最好的直觉