导航:首页 > 编程语言 > java问题排查

java问题排查

发布时间:2022-09-03 21:04:52

‘壹’ 怎样使用jstack诊断java应用程序故障

如果单靠通过查看代码是很难去发现这个问题,在这一次故障排查中,我也学到了怎样更好的使用jvm监控工具来进行诊断,主要用到了jstack和jmap命令,jmap上次已经讲过就不再讲了,下面就一个例子来讲怎么使用jstack来对的Java程序进行诊断。
首先让我们来了解一下jstack这个命令的作用,jstack 是一个可以返回在应用程序上运行的各种各样线程的一个完整转储的实用程序,您可以使用它查明问题。jstack [-l] <pid>,jpid可以通过使用jps命令来查看当前Java程序的jpid值,-l是可选参数,它可以显示线程阻塞/死锁情况。

/**
* 死锁例子
* @author crane.ding
* @since 2011-3-20
*/
public class DeadLock {

public static void main(String[] args) {
final Object obj_1 = new Object(), obj_2 = new Object();

Thread t1 = new Thread("t1"){
@Override
public void run() {
synchronized (obj_1) {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {}

synchronized (obj_2) {
System.out.println("thread t1 done.");
}
}
}
};

Thread t2 = new Thread("t2"){
@Override
public void run() {
synchronized (obj_2) {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {}

synchronized (obj_1) {
System.out.println("thread t2 done.");
}
}
}
};

t1.start();
t2.start();
}

}

以上DeadLock类是一个死锁的例子,假使在我们不知情的情况下,运行DeadLock后,发现等了N久都没有在屏幕打印线程完成信息。这个时候我们就可以使用jps查看该程序的jpid值和使用jstack来生产堆栈结果问题。
$ java -cp deadlock.jar DeadLock &
$

$ jps
3076 Jps
448 DeadLock
$ jstack -l 448 > deadlock.jstack

结果文件deadlock.jstack内容如下:
2011-03-20 23:05:20
Full thread mp Java HotSpot(TM) Client VM (19.1-b02 mixed mode, sharing):

"DestroyJavaVM" prio=6 tid=0x00316800 nid=0x9fc waiting on condition [0x00000000]
java.lang.Thread.State: RUNNABLE

Locked ownable synchronizers:
- None

"t2" prio=6 tid=0x02bcf000 nid=0xc70 waiting for monitor entry [0x02f6f000]
java.lang.Thread.State: BLOCKED (on object monitor)
at com.demo.DeadLock$2.run(DeadLock.java:40)
- waiting to lock <0x22a297a8> (a java.lang.Object)
- locked <0x22a297b0> (a java.lang.Object)

Locked ownable synchronizers:
- None

"t1" prio=6 tid=0x02bce400 nid=0xba0 waiting for monitor entry [0x02f1f000]
java.lang.Thread.State: BLOCKED (on object monitor)
at com.demo.DeadLock$1.run(DeadLock.java:25)
- waiting to lock <0x22a297b0> (a java.lang.Object)
- locked <0x22a297a8> (a java.lang.Object)

Locked ownable synchronizers:
- None

"Low Memory Detector" daemon prio=6 tid=0x02bb9400 nid=0xa6c runnable [0x00000000]
java.lang.Thread.State: RUNNABLE

Locked ownable synchronizers:
- None

"CompilerThread0" daemon prio=10 tid=0x02bb2800 nid=0xcb8 waiting on condition [0x00000000]
java.lang.Thread.State: RUNNABLE

Locked ownable synchronizers:
- None

"Attach Listener" daemon prio=10 tid=0x02bb1000 nid=0x7f4 waiting on condition [0x00000000]
java.lang.Thread.State: RUNNABLE

Locked ownable synchronizers:
- None

"Signal Dispatcher" daemon prio=10 tid=0x02bd2800 nid=0xd80 runnable [0x00000000]
java.lang.Thread.State: RUNNABLE

Locked ownable synchronizers:
- None

"Finalizer" daemon prio=8 tid=0x02bab000 nid=0xe1c in Object.wait() [0x02d3f000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x229e1148> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:118)
- locked <0x229e1148> (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)

Locked ownable synchronizers:
- None

"Reference Handler" daemon prio=10 tid=0x02ba6800 nid=0xbe0 in Object.wait() [0x02cef000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x229e1048> (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 <0x229e1048> (a java.lang.ref.Reference$Lock)

Locked ownable synchronizers:
- None

"VM Thread" prio=10 tid=0x02b6a400 nid=0x568 runnable

"VM Periodic Task Thread" prio=10 tid=0x02bc8400 nid=0x75c waiting on condition

JNI global references: 878

Found one Java-level deadlock:
=============================
"t2":
waiting to lock monitor 0x02baaeec (object 0x22a297a8, a java.lang.Object),
which is held by "t1"
"t1":
waiting to lock monitor 0x02baa2bc (object 0x22a297b0, a java.lang.Object),
which is held by "t2"

Java stack information for the threads listed above:
===================================================
"t2":
at com.demo.DeadLock$2.run(DeadLock.java:40)
- waiting to lock <0x22a297a8> (a java.lang.Object)
- locked <0x22a297b0> (a java.lang.Object)
"t1":
at com.demo.DeadLock$1.run(DeadLock.java:25)
- waiting to lock <0x22a297b0> (a java.lang.Object)
- locked <0x22a297a8> (a java.lang.Object)

Found 1 deadlock.

从这个结果文件我们一看到发现了一个死锁,具体是线程t2在等待线程t1,而线程t1在等待线程t2造成的,同时也记录了线程的堆栈和代码行数,通过这个堆栈和行数我们就可以去检查对应的代码块,从而发现问题和解决问题。

‘贰’ java项目上线前程序没问题,上线后出bug,怎么排查错误

看tomcat下的日志 会抛出异常

‘叁’ Java程序报错怎么解决

一般是由于你的程序需要访问的文件的权限问题,查看访问的文件的属性,看看权限,是不是为只读权限,然后修改权限,设置为完全控制最好,然后再次运行程序就可以啦。

如果还是报错拒绝访问,可能就是由于那个文件所在的文件位置的访问权限问题,这个时候,只要把你所要访问的那个文件移到D盘或者其他盘(C盘以外的其他盘都可以),然后再次运行程序,就可以啦。

‘肆’ java浏览器卡顿白屏排查方法

先确保网络连接顺畅。
先确保网络连接顺畅,再检查URL地址是否错误,打开控制台查看是否有报错信息,查看接口访问是否有请求,查看路由是否有path错误,导致加载了不存在的页面,排除了网络问题以后如果还是白屏,那一般都是css和js加载造成的,css和js会造成阻塞渲染,比如不正确的引入css和js,就会导致它们的加载速度过长,从而导致白屏现象。

‘伍’ java内存溢出的问题如何排查

java程序大家都知道,内存溢出是经常见的错误,下面从基本的开始分析!
内存溢出是由于没被引用的对象(垃圾)过多造成JVM没有及时回收,造成的内存溢出。如果出现这种现象可行代码排查:
一)是否App中的类中和引用变量过多使用了Static修饰 如public staitc Student s;在类中的属性中使用 static修饰的最好只用基本类型或字符串。如public static int i = 0; //public static String str;
二)是否App中使用了大量的递归或无限递归(递归中用到了大量的建新的对象)
三)是否App中使用了大量循环或死循环(循环中用到了大量的新建的对象)
四)检查App中是否使用了向数据库查询所有记录的方法。即一次性全部查询的方法,如果数据量超过10万多条了,就可能会造成内存溢出。所以在查询时应采用“分页查询”。
五)检查是否有数组,List,Map中存放的是对象的引用而不是对象,因为这些引用会让对应的对象不能被释放。会大量存储在内存中。
六)检查是否使用了“非字面量字符串进行+”的操作。因为String类的内容是不可变的,每次运行"+"就会产生新的对象,如果过多会造成新String对象过多,从而导致JVM没有及时回收而出现内存溢出。
如String s1 = "My name";
String s2 = "is";
String s3 = "xuwei";
String str = s1 + s2 + s3 +.........;这是会容易造成内存溢出的
但是String str = "My name" + " is " + " xuwei" + " nice " + " to " + " meet you"; //但是这种就不会造成内存溢出。因为这是”字面量字符串“,在运行"+"时就会在编译期间运行好。不会按照JVM来执行的。
在使用String,StringBuffer,StringBuilder时,如果是字面量字符串进行"+"时,应选用String性能更好;如果是String类进行"+"时,在不考虑线程安全时,应选用StringBuilder性能更好。
知道原因了,解决起来就非常简单了。

‘陆’ 【java】初学者,写了个链栈,报错貌似是栈溢出,排查了几遍找不到问题怎么改,求大佬解答,谢谢!

不会调试,竟然能写出这么多代码?

‘柒’ java出现这样的错误

有时候是真的有问题(确实有错不能运行),有时候是因为import后没有刷新(没错但是不能运行),有时候单纯是eclipse环境出错(其实可以运行),以下是排查过程:
1、先build project,然后右键项目->maven->update project
pom还是有问题就到这个目录,打开命令行,mvn clean->mvn eclipse:clean->mvn eclipse:eclipse 基本就可以啦
去项目的目录下,按shirt加右键,打开powershell,输入mvn clean 然后update project 就可以了。
2、直接在pom.xml文件中修改对应依赖的版本号,换一个存在的版本号就行。
比如mybatis的3.2.5报错,可以换成3.2.8的
3、上面都解决不了
项目- >右键->buildpath->configure build path->java build path->libraries查看具体是哪个jar包报错,这个报错的jar包没加载全,删除这个jar包,到网上直接下载一个替换下,就ok了。
PS,你的情况,应该是第一种就解决了。
PS2,以上都是建立在你其他配置都正常的情况的,假如你连jdk都没有配好(比如很多人装好eclipse就导入项目,jre都没有换成jdk,默认Runtime一直是jre,那当然导入啥都跑不起来)。

阅读全文

与java问题排查相关的资料

热点内容
android仿腾讯新闻 浏览:132
程序员走了 浏览:272
linux设置时间服务器 浏览:282
机械人焊接编程教学视频 浏览:552
体重小本app怎么样 浏览:777
编程语言需求 浏览:935
当兵体重怎么个算法 浏览:171
加密的电脑文件带出去怎么打开 浏览:850
死循环会在编译的时候出错吗 浏览:989
c51单片机特殊寄存器的原理 浏览:580
闪耀永恒特利加密钥 浏览:764
如何夸程序员 浏览:781
天津期货python招聘 浏览:267
单片机机器语言写的程序 浏览:554
韩国直播软件app叫什么名 浏览:920
军营训练不听教官的命令 浏览:263
v开头的音乐播放器是什么APP 浏览:122
单片机是怎么做出来的 浏览:319
博图怎么作为opc服务器 浏览:104
编译做题软件 浏览:298