Ⅰ 如何分析java Thread DUMP
一、Thread Dump介绍
1.1什么是Thread Dump?
Thread Dump是非常有用的诊断Java应用问题的工具。每一个Java虚拟机都有及时生成所有线程在某一点状态的thread-mp的能力,虽然各个 Java虚拟机打印的thread mp略有不同,但是大多都提供了当前活动线程的快照,及JVM中所有Java线程的堆栈跟踪信息,堆栈信息一般包含完整的类名及所执行的方法,如果可能的话还有源代码的行数。
1.2 Thread Dump特点
1. 能在各种操作系统下使用
2. 能在各种Java应用服务器下使用
3. 可以在生产环境下使用而不影响系统的性能
4. 可以将问题直接定位到应用程序的代码行上
1.3 Thread Dump 能诊断的问题
1. 查找内存泄露,常见的是程序里load大量的数据到缓存;
2. 发现死锁线程;
1.4如何抓取Thread Dump
一般当服务器挂起,崩溃或者性能底下时,就需要抓取服务器的线程堆栈(Thread Dump)用于后续的分析. 在实际运行中,往往一次 mp的信息,还不足以确认问题。为了反映线程状态的动态变化,需要接连多次做threadmp,每次间隔10-20s,建议至少产生三次 mp信息,如果每次 mp都指向同一个问题,我们才确定问题的典型性。
有很多方式可用于获取ThreadDump, 下面列出一部分获取方式:
操作系统命令获取ThreadDump:
Windows:
1.转向服务器的标准输出窗口并按下Control + Break组合键, 之后需要将线程堆栈复制到文件中;
UNIX/ Linux:
首先查找到服务器的进程号(process id), 然后获取线程堆栈.
1. ps –ef | grep java
2. kill -3 <pid>
注意:一定要谨慎, 一步不慎就可能让服务器进程被杀死。kill -9 命令会杀死进程。
JVM 自带的工具获取线程堆栈:
JDK自带命令行工具获取PID,再获取ThreadDump:
1. jps 或 ps –ef|grepjava (获取PID)
2. jstack [-l ]<pid> | tee -a jstack.log (获取ThreadDump)
二、java线程的状态转换介绍(为后续分析做准备)
2.1 新建状态(New)
用new语句创建的线程处于新建状态,此时它和其他Java对象一样,仅仅在堆区中被分配了内存。
2.2 就绪状态(Runnable)
当一个线程对象创建后,其他线程调用它的start()方法,该线程就进入就绪状态,Java虚拟机会为它创建方法调用栈和程序计数器。处于这个状态的线程位于可运行池中,等待获得CPU的使用权。
2.3 运行状态(Running)
处于这个状态的线程占用CPU,执行程序代码。只有处于就绪状态的线程才有机会转到运行状态。
2.4 阻塞状态(Blocked)
阻塞状态是指线程因为某些原因放弃CPU,暂时停止运行。当线程处于阻塞状态时,Java虚拟机不会给线程分配CPU。直到线程重新进入就绪状态,它才有机会转到运行状态。
阻塞状态可分为以下3种:
1)位于对象等待池中的阻塞状态(Blocked in object’s wait pool):当线程处于运行状态时,如果执行了某个对象的wait()方法,Java虚拟机就会把线程放到这个对象的等待池中,这涉及到“线程通信”的内容。
2)位于对象锁池中的阻塞状态(Blocked in object’s lock pool):当线程处于运行状态时,试图获得某个对象的同步锁时,如果该对象的同步锁已经被其他线程占用,Java虚拟机就会把这个线程放到这个对象的锁池中,这涉及到“线程同步”的内容。
Ⅱ java怎么获取当前windows进程pid
Runtime.getRuntime()可以获取java运行时的所有信息;java中有Process类,但是Process是用来处理子进程的。
Ⅲ java如何过去外设pidvid
java过去外设pidvid:VID和PID都是两个字节长,其中,供应商ID(VID)由供应商向USB执行论坛申请,每个供应商的VID是唯一的,PID由供应商自行决定,理论上来说,不同的产品、相同产品的不同型号、相同型号的不同设计的产品最好采用不同的PID。
根据USB规范的规定,所有的USB设备都有供应商ID(VID)和产品识别码(PID),主机通过不同的VID和PID来区别不同的设备,VID和PID都是两个字节长。其中,供应商ID(VID)由供应商向USB执行论坛申请,每个供应商的VID是唯一的。
编程环境:
是一个编写Java的Applet小程序和应用程序的程序开发环境。JDK是整个Java的核心,包括了Java运行环境(Java Runtime Environment),一些Java工具和Java的核心类库(Java API)。不论什么Java应用服务器实质都是内置了某个版本的JDK。
主流的JDK是Sun公司发布的JDK,除了Sun之外,还有很多公司和组织都开发了自己的JDK,例如,IBM公司开发的JDK,BEA公司的Jrocket,还有GNU组织开发的JDK。
Ⅳ 通过bat启动java程序,如何在console的标题栏输出这个java进程的pid
进入cmd,输入jvisualvm进入VisualVM工作台
Ⅳ java jconsole的pid是什么
PID(Process ID)操作系统里指进程ID号,也就是进程标识符。操作系统里每打开一个程序都会创建一个进程ID,即PID。
PID(进程控制符)英文全称为Process Identifier,它也属于电工电子类技术术语。
PID是各进程的代号,每个进程有唯一的PID编号。它是进程运行时系统随机分配的,并不代表专门的进程。在运行时PID是不会改变标识符的,但是你终止程序后再运行PID标识符就会被系统回收,就可能会被继续分配给新运行的程序。
含义
只要运行一程序,系统会自动分配一个标识!
是暂时唯一:进程中止后,这个号码就会被回收,并可能被分配给另一个新进程。
只要没有成功运行其他程序,这个pid会继续分配给当前要运行的程序!
如果成功运行一个程序,然后再运行别的程序时,系统会自动分配另一个pid!
PID值越小越好。
Ⅵ 如何获取刚在java程序中启动的进程的PID
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
class StreamDrainer implements Runnable {
private InputStream ins;
public StreamDrainer(InputStream ins) {
this.ins = ins;
}
public void run() {
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(
ins));
String line = null;
while ((line = reader.readLine()) != null) {
//这判断你的进程
if(line.indexOf("QQ.exe")!=-1){
System.out.println("有QQ");
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
public class TestRunCmd {
public static void main(String[] args) {
String[] cmd = new String[] { "cmd.exe", "/C", "wmic process get name" };
try {
Process process = Runtime.getRuntime().exec(cmd);
new Thread(new StreamDrainer(process.getInputStream())).start();
new Thread(new StreamDrainer(process.getErrorStream())).start();
process.getOutputStream().close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
试试这样,我用的线程来做,你改run方法里面的进程名就好了
Ⅶ java中,通过Runtime.getRuntime().exec建立起的进程,如何获得其PID
exec()方法返回一个Process对象,所以下面这样是不是能满足你的需求?
Process process = Runtime.getRuntime().exec(command)
process.destroy()
Ⅷ 总结:脚本中,如何查看正在运行的进程的pid
如果是找出java程序的进程PID,pidof就无能为力了,可以使用ps -ef|grep java或jps -l来查看java进程的信息。通常找出进程PID的目的是确认程序是否在运行、或者为了把它杀掉、或者发送一个信号给它。常用参数格式:pidof program
找出program程序的进程PID,如果有多个就会全部列出,program不能是shell脚本名称。
格式:pidof -s program
找出program程序的进程PID,只列出一个。(Single shot - this instructs the program to only return one pid.)
格式:pidof -x script
找出shell脚本script的进程PID。
参数:-o omitpid
参数:-o omitpid1 -o omitpid2
在列出的进程PID中忽略omitpid。可以有多个。参数:-s只列出一个。
Ⅸ 如何用javaAPI取得java进程的PID
String name = ManagementFactory.getRuntimeMXBean().getName();
System.out.println(name);
// get pid
String pid = name.split("@")[0];
System.out.println("Pid is:" + pid);
Ⅹ java怎么获取已安装的USB口驱动信息(包含信息:驱动名,pid,vid等)
这个可以通过JAVA 的JNI 去调用操作系统的API去获取已安装的USB接口驱动的问题.
至于java的JNI是怎样工作的,以及其工作的原理可以参考下面这篇文章:
IT技术社区:http://www.itskillzone.com/forum.php?mod=viewthread&tid=47&extra=
JAVA基础之理解JNI原理