长沙市网站制作多少钱/如何做个人网站
一、死锁问题和线程阻塞
1、 jstack 命令
jstack -options :可以查看jstack 具体执行那些参数。
jstack是java虚拟机中自带的一种堆栈跟踪工具,jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息。
主要的功能分为两部分:
(1) 针对活着的进程做本地的或远程的线程dump;
(2) 针对core文件做线程dump。
jstack 用于生成java虚拟机当前时刻的线程快照,线程快照是当前Java虚拟机中每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因。如线程间死锁、死循环、请求外部资源导致的长事件等待等。线程出现停顿时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做什么事情,或者等待什么资源。 如果java程序崩溃生成core文件。**stack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。**另外,jstack工具还可以附属到正在运行的java程序中,看到当时运行的java程序的java stack和native stack的信息, 如果现在运行的java程序呈现hung的状态,jstack是非常有用的。
jstack 命令 可以查看线程的 死锁问题、线程的阻塞等待问题(例如一个线程锁住对象。大量线程在该对象上等待。)
注意:持续运行的IO IO操作是可以以Runnable状态达成阻塞。例如数据库的死锁、网络读写。格外注意对IO线程的真实状态的分析,一般来说,被捕获到 RUNNable 的IO 调用,都是有问题的。
以下堆栈显示:线程状态为Runnable 。调用 socketInputStream 或SocketImp上。socketRead0等方法。调用了jdbc的相关的包。很可能发生数据库死锁或者长时间等待。
"d&a-614" daemon prio=6 tid=0x0000000022f1f000 nid=0x37c8 runnable
[0x0000000027cbd000]
java.lang.Thread.State: RUNNABLE
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(Unknown Source)
at oracle.net.ns.Packet.receive(Packet.java:240)
at oracle.net.ns.DataPacket.receive(DataPacket.java:92)
at oracle.net.ns.NetInputStream.getNextPacket(NetInputStream.java:172)
at oracle.net.ns.NetInputStream.read(NetInputStream.java:117)
at oracle.jdbc.driver.T4CMAREngine.unmarshalUB1(T4CMAREngine.java:1034)
at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:588)
具体深入实践参考:https://www.cnblogs.com/kongzhongqijing/articles/3630264.html
二、频繁GC问题或内存溢出问题
**如果发现程序经常出现延迟或报内存溢出问题我们可以用以下命令进行定位跟踪
jstat +jmap 命令
一、使用jps查看线程ID
二、使用jstat -gc 3331 250 20 查看gc情况,一般比较关注PERM区的情况,查看GC的增长情况。
三、使用jstat -gccause:额外输出上次GC原因
四、使用jmap -dump:format=b,file=heapDump 3331生成堆转储文件
五、使用jhat或者可视化工具(Eclipse Memory Analyzer 、IBM HeapAnalyzer)分析堆情况。
六、结合代码解决内存溢出或泄露问题。**
例子:jstat -gcutil 查看gc是否稳定。
命令:jstat -gcutil pid interval(ms)
jstat 应用:https://editor.csdn.net/md/?articleId=89320156
三、查看某个Java进程的启动是指定堆参数
1、查看当前机器的所有的jvm信息
jcmd -l
2、更加具体的pid 查看其具体的启动时指定JVM 信息
C:\Users\jjs>jcmd 10576 VM.flags
10576:
-XX:CICompilerCount=3 -XX:ConcGCThreads=1
-XX:G1HeapRegionSize=1048576 -XX:InitialHeapSize=268435456
-XX:MarkStackSize=4194304 -XX:MaxHeapSize=1073741824
-XX:MaxNewSize=643825664 -XX:MinHeapDeltaBytes=1048576
-XX:+UseCompressedClassPointers -XX:+UseCompressedOops
-XX:+UseFastUnorderedTimeStamps -XX:+UseG1GC
-XX:-UseLargePagesIndividualAllocation -XX:+UseStringDeduplication
注意更多的jcmd 命令参数信息和优化参考:https://www.jianshu.com/p/388e35d8a09b
下一篇 如何快速定位cpu 问题过高的问题