Java程序在Linux下的调试方法
在Linux下调试Java程序前,需确保已安装JDK(包含javac、java、jdb等工具)。可通过以下命令安装OpenJDK(以Ubuntu为例):
sudo apt update && sudo apt install default-jdk
安装完成后,通过java -version和javac -version验证安装是否成功。
jdb是JDK自带的命令行调试工具,适用于简单的代码调试。
javac -g命令编译Java文件(-g选项保留行号、局部变量等信息),例如:javac -g HelloWorld.java
jdb命令启动调试会话,例如:jdb HelloWorld
stop in 类名.方法名:在指定方法的入口设置断点(如stop in HelloWorld.main);run:启动程序,执行到断点处暂停;next(或n):执行下一行代码(不进入方法内部);step(或s):进入方法内部执行;print 变量名(或p 变量名):查看变量的当前值(如print result);cont(或c):继续执行程序直到下一个断点或程序结束。通过在代码中添加日志语句,记录程序执行流程和变量状态,帮助定位问题。常用日志框架包括:
Logger类记录日志,例如:import java.util.logging.Logger;
public class HelloWorld {
private static final Logger logger = Logger.getLogger(HelloWorld.class.getName());
public static void main(String[] args) {
logger.info("程序开始执行");
int result = divide(10, 0);
logger.info("计算结果:" + result);
}
public static int divide(int a, int b) {
logger.info("除法运算:a=" + a + ", b=" + b);
return a / b;
}
}
IDE(如IntelliJ IDEA、Eclipse)提供图形化调试界面,操作更直观,适合大型项目。
若Java程序运行在远程Linux服务器上,可通过**JDWP(Java Debug Wire Protocol)**实现远程调试。
export JPDA_OPTS="-agentlib:jdwp=transport=dt_socket,address=*:5005,server=y,suspend=n"
$CATALINA_HOME/bin/catalina.sh jpda start
其中,address=*:5005表示监听5005端口,server=y表示作为调试服务器,suspend=n表示不暂停程序等待调试器连接。localhost:5005),点击Debug即可连接。jstack用于生成Java进程的线程快照,帮助定位线程死锁、死循环或长时间等待问题。
jps命令查找Java进程ID(PID);top -H -p <PID>命令找出占用CPU高的线程,并将其ID转换为16进制(如printf "%x\n" 90485得到16175);jstack <PID> | grep <nid> -C5命令查看该线程的堆栈信息(nid为线程的16进制ID)。jstack输出中会标记死锁线程)、死循环(线程状态为RUNNABLE且长时间不变化)。jmap用于生成Java堆的内存快照(Heap Dump),jhat用于分析堆快照,帮助定位内存泄漏或内存占用过高问题。
jmap -dump:format=b,file=dump.bin <PID>命令生成堆转储文件(dump.bin);jhat dump.bin命令启动HTTP服务器(默认端口7000),通过浏览器访问http://localhost:7000,查看堆中对象的分布(如对象数量、占用内存大小);jmap -heap <PID>:查看堆内存配置及使用情况;jmap -histo:<PID>:查看堆中对象的统计信息(包括对象数量、占用空间,加live参数可只统计存活对象)。jstat用于监控Java虚拟机的垃圾回收(GC)情况,帮助分析GC频率、内存回收效率。
jstat -gc <PID> 1000(1000表示采样间隔为1秒),输出内容包括Eden区、老年代、永久代的容量、已用空间、GC次数、GC时间等。通过分析GC日志,可判断是否存在频繁GC(如Minor GC或Full GC次数过多)、内存泄漏等问题。