java面试题-JVM问题排查

1.常见的Linux定位问题的工具?

常见的 Linux 定位问题的命令可以分为以下几类:

  1. 系统状态命令:包括 top、uptime、vmstat、sar 等命令,用于查看系统整体的状态,如 CPU 使用率、内存使用率、磁盘 I/O 等。

  1. 进程状态命令:包括 ps、pstree、pgrep、kill 等命令,用于查看进程的状态,如进程 ID、进程占用的资源等。

  1. 网络状态命令:包括 ifconfig、ip、netstat、ss、tcpdump 等命令,用于查看网络接口、网络连接状态、网络流量等。

  1. 文件状态命令:包括 lsof、fuser、df、du 等命令,用于查看文件句柄、文件系统状态、磁盘使用情况等。

  1. Java 应用状态命令:包括 jps、jstat、jmap、jstack、jinfo 等命令,用于查看 Java 应用程序的状态,如 Java 进程 ID、内存使用情况、线程状态等。

2.JDK自带的定位问题的工具?

  1. jps

jps (Java Process Status Tool) 是一个命令行工具,用于列出系统中所有正在运行的 Java 进程的进程 ID。可以用于确认 Java 进程是否已经启动,以及进程的 PID,便于后续进行进一步的诊断。

jps 命令常用的参数如下:

  • -q:只输出进程 ID,不输出类名和参数;

  • -m:输出主类名和参数;

  • -l:输出完整的包名、类名和参数。

使用示例:

jps             // 输出所有 Java 进程的进程 ID 和类名
jps -q          // 只输出进程 ID
jps -m          // 输出主类名和参数
jps -l          // 输出完整的包名、类名和参数
  1. jstat

jstat (JVM Statistics Monitoring Tool) 是一个命令行工具,用于监控 Java 应用程序的各种状态信息,如垃圾回收、类加载、内存、线程等。可以帮助开发人员了解应用程序的实时状态,发现性能瓶颈和内存泄漏等问题。

jstat 命令常用的参数如下:

  • -gcutil:显示 GC 情况的统计信息,包括 Eden 区、Survivor 区和老年代的使用情况、GC 时间、GC 频率等;

  • -gcnew:显示新生代的 GC 情况,包括 Eden 区和 Survivor 区的使用情况、GC 时间、GC 频率等;

  • -gcold:显示老年代的 GC 情况,包括老年代的使用情况、GC 时间、GC 频率等;

  • -gcpermcapacity:显示永久代的使用情况,包括永久代的使用量、使用率等;

  • -gcnewcapacity:显示新生代的使用情况,包括 Eden 区和 Survivor 区的使用量、使用率等;

  • -gccapacity:显示各个区域的容量情况,包括 Eden 区、Survivor 区和老年代的容量、使用量、使用率等;

  • -class:显示类加载器的加载类的数量、类加载器的数量、已卸载的类的数量等信息;

  • -compiler:显示 JIT 编译器的编译情况,包括编译任务数、编译失败的任务数、编译耗时等;

  • -printcompilation:显示 JIT 编译器编译方法的详细信息;

  • -uptime:显示 JVM 运行时间等信息。

使用示例:

jstat -gcutil 1234         // 监控进程 ID 为 1234 的 JVM 的 GC 情况
jstat -gcnewcapacity 1234  // 监控进程 ID 为 1234 的 JVM 的新生代的使用情况
jstat -class 1234          // 监控进程 ID 为 1234 的 JVM 的类加载器的信息

上述命令会每隔 1 秒(1000 毫秒)输出一次 PID 为 <pid> 的 Java 应用程序的 GC 相关信息,一共输出 10 次。

  1. jmap

jmap (JVM Memory Map Tool) 是一个命令行工具,用于生成 Java 应用程序的内存映像,包括堆内存、非堆内存、PermGen/Metaspace 等。可以用于查看内存使用情况、定位内存泄漏等问题。

以下是jmap的常用命令及其作用:

  • jmap -heap <pid>:打印Java进程的堆内存信息,包括使用的垃圾回收器、堆大小、新生代大小、新生代中Eden区、Survivor区的比例等。

  • jmap -histo <pid>:输出Java进程中各个类的实例数量和占用空间大小。可以通过该命令查看某个类的实例数量,以及这些实例的内存使用情况。

  • jmap -dump:live,format=b,file=<filename> <pid>:生成Java进程的堆转储快照。-dump参数指定生成转储快照,live表示只转储堆中存活的对象,format=b表示生成二进制格式的转储快照,file=<filename>指定生成的转储快照文件名。

需要注意的是,jmap会暂停Java进程的运行,生成堆转储快照期间会影响应用程序的性能,应尽量避免在生产环境中使用。同时,由于jmap需要读取Java进程的内存信息,需要具有相应的权限才能使用。

使用示例:

jmap -dump:format=b,file=heapdump.bin <pid>

上述命令会生成一个名为 heapdump.bin 的二进制文件,保存了 PID 为 <pid> 的 Java 应用程序的内存信息。

  1. jstack

jstack (JVM Stack Trace Tool) 是一个命令行工具,用于生成 Java 应用程序的线程转储信息,可以帮助开发人员定位死锁等线程相关的问题。

jstack [-l] <pid>

其中,-l 表示输出详细的锁信息。<pid> 表示 Java 进程的进程 ID。如果省略 -l 参数,则只输出线程的调用栈信息。

使用示例:

使用jstack命令生成线程快照。

$ jstack 12456 > threads.txt

上述命令将生成一个名为threads.txt的文件,其中包含Java进程中所有线程的堆栈跟踪信息。

  1. JStat

JStat 是 JDK 自带的一款命令行工具,用于查看 JVM 的统计信息。它可以查看 JVM 中的垃圾回收信息、类加载信息、线程状态等,帮助开发人员快速了解 JVM 的运行情况。

以下是JStat常用的选项:

  • -class:监视类装载、卸载情况。

  • -gc:监视垃圾回收情况。

  • -compiler:监视JIT编译情况。

  • -gcutil:输出垃圾回收统计信息,包括堆使用情况、GC时间、各种GC事件等。

  • -gcnew:输出新生代垃圾回收统计信息。

  • -gcold:输出老年代垃圾回收统计信息。

  • -util:输出各种内存池的使用情况。

JStat的使用非常简单,只需要在命令行中输入"jstat"加上相应的选项和JVM进程ID即可。例如:

jstat -gcutil 1234

这条命令将输出JVM进程ID为1234的垃圾回收统计信息。JStat输出的结果类似于下面这样:

S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT   
  0.00  66.85  29.35  67.92  52.90   2342   27.755    3    0.204   27.959

其中,S0和S1是新生代中的两个Survivor区域的使用情况,E是新生代中Eden区域的使用情况,O是老年代的使用情况,P是永久代的使用情况。YGC表示Young GC的次数,YGCT表示Young GC所花费的时间,FGC表示Full GC的次数,FGCT表示Full GC所花费的时间,GCT表示总的GC时间。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值