JDK开发团队选择Java语言来直线这些故障处理工具是有原因的:
当应用程序部署到生产环境后,无论是人工物理接触到服务器还是远程Telnet到服务器上都可能会受限制。而使用这些工具类库里面的接口和实现代码,开发者可以选择直接在应用程序中提供功能强大的监控分析功能。
基础工具
jps (windows命令行直接输入jps)
jstat -gc 2764 250 20 (每250毫秒查询一次进程2764垃圾收集情况,共查询20次)
jinfo -flag CMSInitiatingOccupancyFraction 1444(查询线程1444的CMSInitiatingOccupancyFraction 参数值)
jmap生成堆转储快照
jhat分析jmap生成的堆转储快照(用的少)
jstack用于生成虚拟机当前时刻的线程快照,为了找到线程出现长时间停滞的原因时常用jstack。
jstack -l 3500(查询LVMID是3500的线程的快照)
可视化故障处理工具
JHSDB
分析的代码如下
public class JvmTest {
static class Test {
static ObjectHolder staticObj = new ObjectHolder();
ObjectHolder instanceObj = new ObjectHolder();
void foo() {
ObjectHolder localObj = new ObjectHolder();
System.out.println("done");
}
}
private static class ObjectHolder{}
public static void main(String[] args) {
// TODO Auto-generated method stub
Test test = new JvmTest.Test();
test.foo();
}
}
staticObj 方法区
instanceObj Java堆
localObject 局部变量表
参数
-verbose:gc -Xmx10M -XX:+UseSerialGC -XX:-UseCompressedOops
(限制了Java堆大小,使用Serial垃圾收集器,禁用压缩指针)
设置断点在print,输入jps -l
然后jhsdb hsdb --pid 18008
但是我的jdk没有jhsdb
JConsole
分析的代码如下
public class JvmTest {
static class OOMObject{
public byte[] placeholder = new byte[64 * 1024];
}
public static void fillHeap(int num) throws InterruptedException {
List<OOMObject> list = new ArrayList<OOMObject>();
for(int count = 0;count < num; count++) {
Thread.sleep(50);
list.add(new OOMObject());
}
System.gc();
}
public static void main(String[] args) throws InterruptedException {
// TODO Auto-generated method stub
fillHeap(1000);
}
}
JConsole结果如图
VisualVM