Tomcat启动不报错,但是没有定时执行程序,老板执行了ctrl+break键,在Tomcat界面输出了大量的信息,我很郁闷就在网上查了什么意思,在这记录下来,供以后学习。
参考:https://segmentfault.com/a/1190000014199369
在windows上,这两个组合键的作用是将线程转储打印到应用程序的标准输出。在Linux上是ctrl+反斜杠\。
Ctrl+Break作用:线程转储、检测死锁、堆摘要。
1.线程转储
线程转储由线程堆栈(包括线程状态)组成,用于虚拟机中的所有Java线程。线程转储不会终止应用程序:在打印线程信息之后,将继续执行程序。
"Timer-0" #30 daemon prio=5 os_prio=0 tid=0x0000000022d5e000 nid=0xab88 in Objec
t.wait() [0x000000002d47f000]
java.lang.Thread.State: TIMED_WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x00000006c36b5710> (a java.util.TaskQueue)
at java.util.TimerThread.mainLoop(Timer.java:552)
- locked <0x00000006c36b5710> (a java.util.TaskQueue)
at java.util.TimerThread.run(Timer.java:505)
"scheduler_QuartzSchedulerThread" #29 prio=5 os_prio=0 tid=0x0000000022d5d000 ni
d=0xbabc in Object.wait() [0x000000002c2df000]
java.lang.Thread.State: TIMED_WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
at org.quartz.core.QuartzSchedulerThread.run(QuartzSchedulerThread.java:
410)
- locked <0x00000006c36ddd38> (a java.lang.Object)
"scheduler_Worker-10" #28 prio=5 os_prio=0 tid=0x0000000022324800 nid=0xc43c in
Object.wait() [0x000000002e05f000]
java.lang.Thread.State: TIMED_WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.j
ava:568)
- locked <0x00000006c36c56e0> (a java.lang.Object)
输出由一个空行分隔多个线程项。java线程首先打印出来,后面是有关VM内部线程的信息。每个线程项都由标题行和线程堆栈跟踪组成。
标题行包含有关线程的以下信息:
线程名称:Timer-0
指示线程是否为守护进程线程:daemon
线程优先级(prio):prio=5
线程ID(tid),它是内存中线程结构的地址:tid=0x0000000022d5e000
本机线程的ID(nid):nid=0xab88
线程状态,指示线程在线程转储时所做的操作:Object.wait()
地址范围,它给出了线程的有效堆栈区域的估计值:[0x000000002d47f000]
2.检测死锁
除了线程堆栈之外, 控件 + 中断处理程序还执行死锁检测算法。如果检测到任何死锁, 则控制 + 中断处理程序在每个已死锁线程上的线程转储之后打印附加信息。
死锁线程的附加信息
Found one Java-level deadlock:
=============================
"Thread2":
waiting to lock monitor 0x000af330 (object 0xf819a938, a java.lang.String),
which is held by "Thread1"
"Thread1":
waiting to lock monitor 0x000af398 (object 0xf819a970, a java.lang.String),
which is held by "Thread2"
Java stack information for the threads listed above:
===================================================
"Thread2":
at Deadlock$DeadlockMakerThread.run(Deadlock.java:32)
- waiting to lock <0xf819a938> (a java.lang.String)
- locked <0xf819a970> (a java.lang.String)
"Thread1":
at Deadlock$DeadlockMakerThread.run(Deadlock.java:32)
- waiting to lock <0xf819a970> (a java.lang.String)
- locked <0xf819a938> (a java.lang.String)
Found 1 deadlock.
如果设置了 JVM 标志-XX:+PrintConcurrentLocks , 则Control + Break 处理程序还将打印每个线程拥有的并发锁的列表。
3.堆摘要
Control + Break 处理程序也会打印堆摘要。显示不同的世代 (堆的区域), 大小、使用量和地址范围。如果同时使用工具 (如pmap ) 检查进程, 则地址范围尤其有用。
Heap
def new generation total 1152K, used 435K [0x22960000, 0x22a90000, 0x22e40000
)
eden space 1088K, 40% used [0x22960000, 0x229ccd40, 0x22a70000)
from space 64K, 0% used [0x22a70000, 0x22a70000, 0x22a80000)
to space 64K, 0% used [0x22a80000, 0x22a80000, 0x22a90000)
tenured generation total 13728K, used 6971K [0x22e40000, 0x23ba8000, 0x269600
00)
the space 13728K, 50% used [0x22e40000, 0x2350ecb0, 0x2350ee00, 0x23ba8000)
compacting perm gen total 12288K, used 1417K [0x26960000, 0x27560000, 0x2a9600
00)
the space 12288K, 11% used [0x26960000, 0x26ac24f8, 0x26ac2600, 0x27560000)
ro space 8192K, 62% used [0x2a960000, 0x2ae5ba98, 0x2ae5bc00, 0x2b160000)
rw space 12288K, 52% used [0x2b160000, 0x2b79e410, 0x2b79e600, 0x2bd60000)
如果设置了 JVM 标志-XX:+PrintClassHistogram , 则Control + Break 处理程序将生成堆直方图。