尝试启动JFR录制时AttachNotSupportedException

时间:2017-01-17 16:35:40

标签: jvm jmc jfr

我在尝试开始JFR录制时收到 private void print() { string dest = @"C:\Users\bwilliams\Desktop\balltest1.pdf"; string src = @"C:\Users\bwilliams\Desktop\BallTags.pdf"; Rectangle[] columns = new Rectangle[] { new Rectangle(100,500,150,200), new Rectangle(250,500,150,200), new Rectangle(400,500,150,200), new Rectangle(550,500,150,200) }; PdfWriter writer = new PdfWriter(dest); PdfDocument pdf = new PdfDocument(new PdfReader(src), writer); Document doc = new Document(pdf,PageSize.A4.Rotate()); doc.SetRenderer(new ColumnDocumentRenderer(doc, columns)); doc.Add(new Paragraph("Ebonite").SetPaddings(150, 60, 0, 0).SetFontSize(24).SetFont(Arial).SetFixedLeading(24)); doc.Add(new Paragraph("GB2 MVP").SetPaddings(150, 0, 0, 0).SetFontSize(24).SetFixedLeading(24)); doc.Add(new Paragraph("$114.95").SetPaddings(150, 0, 0, 0).SetFontSize(24).SetFixedLeading(24)); doc.Add(new Paragraph("").SetPaddings(0, 0, 0, 0).SetFontSize(24)); doc.Add(new Paragraph("").SetPaddings(0, 0, 0, 0).SetFontSize(24)); doc.Add(new Paragraph("").SetPaddings(0, 0, 0, 0).SetFontSize(24)); doc.Add(new Paragraph("").SetPaddings(0, 0, 0, 0).SetFontSize(24)); doc.Add(new Paragraph("").SetPaddings(0, 0, 0, 0).SetFontSize(24)); doc.Add(new Paragraph("").SetPaddings(0, 0, 0, 0).SetFontSize(24)); doc.Add(new Paragraph("").SetPaddings(0, 0, 0, 0).SetFontSize(24)); doc.Close(); } 。 它一直正常工作,直到现在。

AttachNotSupportedException

输出:

jcmd 3658 JFR.start maxsize=100M filename=jfr_1.jfr dumponexit=true settings=profile

可能会发生什么?

SO:Oracle Linux Server版本6.7

3658:
com.sun.tools.attach.AttachNotSupportedException: Unable to open socket file: target process not responding or HotSpot VM not loaded
        at sun.tools.attach.LinuxVirtualMachine.<init>(LinuxVirtualMachine.java:106)
        at sun.tools.attach.LinuxAttachProvider.attachVirtualMachine(LinuxAttachProvider.java:63)
        at com.sun.tools.attach.VirtualMachine.attach(VirtualMachine.java:208)

3 个答案:

答案 0 :(得分:4)

其中一个可能的原因是/tmp/.java_pid1234文件已被删除(其中1234是Java进程的PID)。

依赖于动态连接机制(jstack,jmap,jcmd,jinfo)的工具通过在/tmp创建的UNIX域套接字与JVM进行通信。 如果指定-XX:+StartAttachListener标志,则此套接字在第一次附加尝试时由懒惰的JVM创建,或者急切地在JVM初始化时创建。

删除与套接字对应的文件后,工具无法连接到目标进程,遗憾的是,如果不重新启动JVM,则无法重新创建通信套接字。

有关动态附加机制的说明,请参阅this answer

答案 1 :(得分:0)

凭借个人经验......在将开发环境划分为分区,并且操作系统所在的分区与操作系统分区不同的情况下,也会出现此问题。例如,操作系统分区是EXT4,开发环境分区是NTFS(JVM所在的位置)。出现问题是因为您无法创建文件&#34; /tmp/.java_pid6024" (其中6024是java进程的PID)。 要在JVM或应用程序服务器的开头添加-XX:+ StartAttachListener进行故障排除。

答案 2 :(得分:0)

另一种可能性:您的应用在systemd下使用'PrivateTmp = yes'运行。这可以防止找到/tmp/.java_pid1234文件。