Java,获取核心转储

Java,获取核心转储,java,debugging,coredump,Java,Debugging,Coredump,我希望能够以与分析UNIX系统上进程的核心转储相同的方式分析Java核心转储。但是,我对从进程中获取信息不感兴趣,只对JVM级别的堆栈、堆等感兴趣。核心转储将包含有关Java方法、变量等的信息 如何告诉JVM构建Java级核心转储 什么是分析上述转储的好工具 例如,如果执行此代码 public static void foo() { //trigger core dump } public static void main(String args[]) { foo(); } 我会得到一个

我希望能够以与分析UNIX系统上进程的核心转储相同的方式分析Java核心转储。但是,我对从进程中获取信息不感兴趣,只对JVM级别的堆栈、堆等感兴趣。核心转储将包含有关Java方法、变量等的信息

  • 如何告诉JVM构建Java级核心转储
  • 什么是分析上述转储的好工具
  • 例如,如果执行此代码

    public static void foo() {
      //trigger core dump
    }
    public static void main(String args[]) {
     foo();
    }
    

    我会得到一个显示堆栈
    main-->foo

    的核心转储。完成这种事情的简单方法是将交互式调试器附加到JVM,暂停它,并使用调试器查看堆栈,等等。

    您可以使用它生成堆转储

    一旦有了堆转储,就可以使用类似的工具来检查转储

    如果您要查找的是堆栈跟踪,请尝试类似的操作。

    jstack


    将转储所有正在运行的线程的堆栈跟踪。您需要与正在运行的java进程是同一个用户。

    当代码运行在生产环境中时,这会起作用吗?据我所知,交互式调试器只有在IDE中才有意义。@Mike-您可以将调试器附加到在生产机器上运行的JVM上。您只需确保在启动时启用JDPA代理即可。@StephenC+1,以防没有生产环境。但我怀疑这在生产环境中是否切实可行。正常情况下,生产机器位于单独的网络(DMZ)上,通过局域网和外部网络进行防火墙连接,只能通过哑终端访问,怀疑网络安全团队是否愿意批准开放JPDA端口,如果愿意,那么这是一个好主意:)@PrashantBhate-如果您可以登录到生产机器,有一个Java调试器,您可以从命令行使用-。如果你连登录都不能,你就没有机会了。如果网络安全不允许您对机器进行所需的网络访问以完成工作,请与管理层联系。(根据我的经验,网络安全人员并没有那么死板。)当你看一看JVM回溯时,你是否很清楚实际Java应用程序的回溯是什么?我想JITing会让这更困难。我基本上是一个C++,所以我没有这方面的经验。