java - 如何在 Windows 上获取不在控制台中运行的 Java 进程的线程和堆转储

标签 java jvm heap-dump thread-dump

我有一个从控制台运行的 Java 应用程序,该控制台又执行另一个 Java 进程。我想获得该子进程的线程/堆转储。

在 Unix 上,我可以做一个 kill -3 <pid>但在 Windows AFAIK 上,获取线程转储的唯一方法是控制台中的 Ctrl-Break。但这只会给我父进程的转储,而不是子进程。

还有其他方法可以获得堆转储吗?

最佳答案

假设您知道 pid,您可以使用 jmap 获取任何正在运行的进程的转储。

使用任务管理器或资源监视器获取 pid。那么

jmap -dump:format=b,file=heap.hprof <pid>

获取该进程的堆。

对于安装了 bashpgrep 并且运行单个 Java 进程的系统,请尝试:

jmap -dump:format=b,file=heap.hprof $(pgrep java)

关于java - 如何在 Windows 上获取不在控制台中运行的 Java 进程的线程和堆转储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/407612/

相关文章:

java - 空检查不起作用

java - 尝试使用 ng-file-upload 在 Spring 中上传许多文件时出现空 List<MultipartFile>

java - JVM 远程调试 session 因未捕获的异常而终止

Java堆转储和堆分析后的堆大小不同

java - 如何从 Kubernetes k8s pod 获取堆转储?

java - jOOQ fetchGroups 不返回一对多关系的空集合

java - 生成的 JSON 中缺少 JPA 实体属性名称

java - 是否可以在 java jit 上删除带有 final boolean 值的跳转?

java - 为什么 JVM 有 iconst_2 - iconst_5 操作码?

java - Java 堆转储中的统计信息分割是什么