主线程没有调用堆栈的Java线程转储?(jsvc)

主线程没有调用堆栈的Java线程转储?(jsvc),java,thread-dump,Java,Thread Dump,我们有一个java进程作为守护进程运行(在jsvc下)。每隔几天它就会停止工作;日志文件的输出停止(非常详细,每5分钟一次),并且不消耗CPU或IO 日志文件、syserr或sysout中均未记录异常。最后一个log语句就在执行db commit之前,但是db服务器(MySQL)上没有打开的连接,并且在查看代码之后,应该始终有额外的日志输出,即使它遇到了将冒泡的异常 我发现最奇怪的是,在线程转储(包括下面)中,我们的代码中根本没有线程,主线程似乎没有任何上下文: "main" prio=10 t

我们有一个java进程作为守护进程运行(在jsvc下)。每隔几天它就会停止工作;日志文件的输出停止(非常详细,每5分钟一次),并且不消耗CPU或IO

日志文件、syserr或sysout中均未记录异常。最后一个log语句就在执行db commit之前,但是db服务器(MySQL)上没有打开的连接,并且在查看代码之后,应该始终有额外的日志输出,即使它遇到了将冒泡的异常

我发现最奇怪的是,在线程转储(包括下面)中,我们的代码中根本没有线程,主线程似乎没有任何上下文:

"main" prio=10 tid=0x0000000000614000 nid=0x445d runnable [0x0000000000000000]
  java.lang.Thread.State: RUNNABLE
如前所述,这是一个使用jsvc运行的守护进程,但我不知道这是否与此有关(我可以重新构造代码,以允许直接运行它进行测试)

对这里可能发生的事情有什么建议吗

谢谢。。。dwh

完整线程转储:

Full thread dump Java HotSpot(TM) 64-Bit Server VM (14.2-b01 mixed mode):

"MySQL Statement Cancellation Timer" daemon prio=10 tid=0x00002aaaf81b8800 nid=0x447b in Object.wait() [0x00002aaaf6a22000]
   java.lang.Thread.State: WAITING (on object monitor)
 at java.lang.Object.wait(Native Method)
 - waiting on <0x00002aaab5556d50> (a java.util.TaskQueue)
 at java.lang.Object.wait(Object.java:485)
 at java.util.TimerThread.mainLoop(Timer.java:483)
 - locked <0x00002aaab5556d50> (a java.util.TaskQueue)
 at java.util.TimerThread.run(Timer.java:462)

"Low Memory Detector" daemon prio=10 tid=0x00000000006a4000 nid=0x4479 runnable [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"CompilerThread1" daemon prio=10 tid=0x00000000006a1000 nid=0x4477 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"CompilerThread0" daemon prio=10 tid=0x000000000069d000 nid=0x4476 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Signal Dispatcher" daemon prio=10 tid=0x000000000069b000 nid=0x4465 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Finalizer" daemon prio=10 tid=0x0000000000678800 nid=0x4464 in Object.wait() [0x00002aaaf61d6000]
   java.lang.Thread.State: WAITING (on object monitor)
 at java.lang.Object.wait(Native Method)
 - waiting on <0x00002aaab54a1cb8> (a java.lang.ref.ReferenceQueue$Lock)
 at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:118)
 - locked <0x00002aaab54a1cb8> (a java.lang.ref.ReferenceQueue$Lock)
 at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:134)
 at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:159)

"Reference Handler" daemon prio=10 tid=0x0000000000676800 nid=0x4463 in Object.wait() [0x00002aaaf60d5000]
   java.lang.Thread.State: WAITING (on object monitor)
 at java.lang.Object.wait(Native Method)
 - waiting on <0x00002aaab54a1cf0> (a java.lang.ref.Reference$Lock)
 at java.lang.Object.wait(Object.java:485)
 at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:116)
 - locked <0x00002aaab54a1cf0> (a java.lang.ref.Reference$Lock)

"main" prio=10 tid=0x0000000000614000 nid=0x445d runnable [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"VM Thread" prio=10 tid=0x0000000000670000 nid=0x4462 runnable 

"GC task thread#0 (ParallelGC)" prio=10 tid=0x000000000061e000 nid=0x445e runnable 

"GC task thread#1 (ParallelGC)" prio=10 tid=0x0000000000620000 nid=0x445f runnable 

"GC task thread#2 (ParallelGC)" prio=10 tid=0x0000000000622000 nid=0x4460 runnable 

"GC task thread#3 (ParallelGC)" prio=10 tid=0x0000000000623800 nid=0x4461 runnable 

"VM Periodic Task Thread" prio=10 tid=0x00000000006a6800 nid=0x447a waiting on condition 

JNI global references: 797

Heap
 PSYoungGen      total 162944K, used 48388K [0x00002aaadff40000, 0x00002aaaf2ab0000, 0x00002aaaf5490000)
  eden space 102784K, 47% used [0x00002aaadff40000,0x00002aaae2e81170,0x00002aaae63a0000)
  from space 60160K, 0% used [0x00002aaaeb850000,0x00002aaaeb850000,0x00002aaaef310000)
  to   space 86720K, 0% used [0x00002aaae63a0000,0x00002aaae63a0000,0x00002aaaeb850000)
 PSOldGen        total 699072K, used 699072K [0x00002aaab5490000, 0x00002aaadff40000, 0x00002aaadff40000)
  object space 699072K, 100% used [0x00002aaab5490000,0x00002aaadff40000,0x00002aaadff40000)
 PSPermGen       total 21248K, used 9252K [0x00002aaab0090000, 0x00002aaab1550000, 0x00002aaab5490000)
  object space 21248K, 43% used [0x00002aaab0090000,0x00002aaab09993e8,0x00002aaab1550000)
全线程转储Java热点(TM)64位服务器VM(14.2-b01混合模式):
对象中的“MySQL语句取消计时器”守护程序prio=10 tid=0x00002aaf81b8800 nid=0x447b。wait()[0x00002aaf6A22000]
java.lang.Thread.State:正在等待(在对象监视器上)
在java.lang.Object.wait(本机方法)
-等待(java.util.TaskQueue)
等待(Object.java:485)
位于java.util.TimerThread.mainLoop(Timer.java:483)
-锁定(java.util.TaskQueue)
在java.util.TimerThread.run(Timer.java:462)
“低内存检测器”守护进程prio=10 tid=0x00000000006a4000 nid=0x4479可运行[0x0000000000000000]
java.lang.Thread.State:可运行
“CompilerThread1”守护进程prio=10 tid=0x00000000006a1000 nid=0x4477等待条件[0x0000000000000000]
java.lang.Thread.State:可运行
“CompilerThread0”守护进程prio=10 tid=0x000000000069d000 nid=0x4476等待条件[0x0000000000000000]
java.lang.Thread.State:可运行
“信号调度器”守护程序prio=10 tid=0x000000000069b000 nid=0x4465等待条件[0x0000000000000000]
java.lang.Thread.State:可运行
Object.wait()中的“Finalizer”守护程序prio=10 tid=0x0000000000678800 nid=0x4464[0x00002aaaf61d6000]
java.lang.Thread.State:正在等待(在对象监视器上)
在java.lang.Object.wait(本机方法)
-等待(java.lang.ref.ReferenceQueue$Lock)
位于java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:118)
-锁定(java.lang.ref.ReferenceQueue$Lock)
位于java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:134)
位于java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:159)
Object.wait()中的“引用处理程序”守护程序prio=10 tid=0x0000000000676800 nid=0x4463[0x00002AAF60D5000]
java.lang.Thread.State:正在等待(在对象监视器上)
在java.lang.Object.wait(本机方法)
-等待(java.lang.ref.Reference$Lock)
等待(Object.java:485)
在java.lang.ref.Reference$ReferenceHandler.run(Reference.java:116)
-锁定(一个java.lang.ref.Reference$Lock)
“主”优先级=10 tid=0x0000000000614000 nid=0x445d可运行[0x0000000000000000]
java.lang.Thread.State:可运行
“虚拟机线程”优先级=10 tid=0x00000000000670000 nid=0x4462可运行
“GC任务线程#0(并行GC)”优先级=10 tid=0x000000000061e000 nid=0x445e可运行
“GC任务线程#1(并行GC)”优先级=10 tid=0x00000000000 nid=0x445f可运行
“GC任务线程#2(并行GC)”prio=10 tid=0x00000000000622000 nid=0x4460 runnable
“GC任务线程#3(并行GC)”优先级=10 tid=0x000000000062380 nid=0x4461可运行
“VM定期任务线程”优先级=10 tid=0x00000000006a6800 nid=0x447a等待状态
JNI全球参考:797
堆
PSYoungGen总计162944K,使用48388K[0x00002AADFF40000,0x00002AAF2AB0000,0x00002AAF5490000)
eden空间102784K,47%已使用[0x00002AADFF40000,0x00002AAE2E81170,0x00002AAE63A0000)
从空间60160K开始,0%已使用[0x00002AAEB850000,0x00002AAEB850000,0x00002AAEF310000)
到空间86720K,0%已使用[0x00002AAE63A0000,0x00002AAE63A0000,0x00002AAE63A0000]
PSOldGen总计699072K,使用699072K[0x00002AAB5490000,0x00002AADFF40000,0x00002AADFF40000)
对象空间699072K,100%已使用[0x00002AAB5490000,0x00002AADFF40000,0x00002AADFF40000)
PSPermGen总计21248K,使用9252K[0x00002AAB0090000,0x00002AAB1550000,0x00002AAB5490000)
对象空间21248K,43%已使用[0x00002AAB0090000,0x00002AAB09993E8,0x00002AAB1550000)

并非所有的可丢弃文件都是例外。您的错误日志代码是否捕获错误(OutOfMemoryError、StackOverflowerError等)?

另外两种可能性:

  • 异常可能是在不记录异常的工作线程上引发的。您可以使用thread.setDefaultUncaughtExceptionHandler(…)解决此问题

  • 抛出的异常可能会覆盖Throwable.fillInStackTrace()方法。(这是一个很长的机会……但显然有些人这样做是为了防止逆向工程。)

没有好的建议,但请注意,您的终身教育一代是100%;可能会发生一些奇怪的GC交互