当前位置: 首页 > 知识库问答 >
问题:

在Java中生成线程转储时,哪种方法最不引人注目?

利俊迈
2023-03-14
    null

共有1个答案

苏高峰
2023-03-14

如果只需要将所有堆栈跟踪转储到stdout,kill-3jstack应该是最便宜的。该功能是在JVM代码中本机实现的。不创建中间结构-VM在遍历堆栈时自行打印所有内容。

这两个命令执行相同的VM操作,只是信号处理程序在本地将堆栈跟踪打印到Java进程的stdout,而jstack通过IPC(Linux上的Unix域套接字或Windows上的命名管道)接收来自目标VM的输出。

jstack在引擎盖下使用动态附加机制。如果希望以纯字节流的形式接收堆栈跟踪,还可以直接使用动态附加。

import com.sun.tools.attach.VirtualMachine;
import sun.tools.attach.HotSpotVirtualMachine;
import java.io.InputStream;

public class StackTrace {

    public static void main(String[] args) throws Exception {
        String pid = args[0];
        HotSpotVirtualMachine vm = (HotSpotVirtualMachine) VirtualMachine.attach(pid);

        try (InputStream in = vm.remoteDataDump()) {
            byte[] buf = new byte[8000];
            for (int bytes; (bytes = in.read(buf)) > 0; ) {
                System.out.write(buf, 0, bytes);
            }
        } finally {
            vm.detach();
        }
    }
}
 类似资料:
  • 问题内容: 除了堆转储(java_pid14941.hprof),Java 6还会生成线程转储吗? 这就是我的一个应用程序发生的事情。 java.lang.OutOfMemoryError:超出了GC开销限制将堆倾倒到java_pid14941.hprof … 我确实在工作目录中找到了ava_pid14941.hprof,但没有找到任何包含线程转储的文件。当我收到此OutOfMemory错误时,我

  • 问题内容: 我想创建一个跟踪内存使用情况和cpu使用情况的线程。 如果应用程序达到较高级别,我想生成一个堆转储或线程转储。 有没有一种方法可以生成线程转储运行时而无需重新启动? 问题答案: 这是我们以编程方式进行的操作:http : //pastebin.com/uS5jYpd4 我们使用 和类: 您也可以在〜unix下进行操作以将堆栈转储到标准输出中。还有jstack来转储JVM的堆栈。 我们还

  • 问题内容: 我有一个最终应该生成的程序。程序代码为: 我使用以下参数运行程序: 该程序因OutOfMemory失败,但未生成转储文件。 你知道为什么吗? 问题答案: 对于初学者,请删除XX选项以及 之前的 所有选项,否则,请将参数传递给Java程序而不是JVM

  • 问题内容: 还有其他类似PHPExcel的PHP组件吗? 问题答案: 有一些类可以生成PHP Excel文件(真正的excel文件,而不是.csv文件)。我使用 (DEPRICATED) 请参阅编辑2: https://github.com/PHPOffice/PHPExcel 但是:尝试使用Java excel READER读取这些生成的excel文件时遇到了问题,因此此PHP脚本中可能存在错误

  • 问题内容: 问题场景:在sonic MF容器(jvm)中发现了问题。该容器托管了一些负责db操作和消息转换的Java服务。启动后,该容器可以正常运行2-3周,并自行终止而不抛出任何例外。 经过大量研究,我们无法找出导致jvm(MF容器)关闭的原因或原因。 有没有一种方法可以在jvm自动关闭时获取线程转储?我正在使用Java 1.6。我应该采取其他方法解决此问题吗? 提前致谢。 问题答案: 您可以尝