我正在使用kill -3命令在unix中查看JVM的线程转储.但是我在哪里可以找到此kill命令的输出?我搞不清楚了!!
我必须运行jmap才能获取我的进程的堆转储.但jvm回来了:
Unable to open socket file: target process not responding or HotSpot VM not loaded
The -F option can be used when the target process is not responding
Run Code Online (Sandbox Code Playgroud)
所以我使用了-F:
./jmap -F -dump:format=b,file=heap.bin 10330
Attaching to process ID 10331, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 24.51-b03
Dumping heap to heap.bin ...
Run Code Online (Sandbox Code Playgroud)
-F 是可以进行堆转储吗?很久以前,我从Java参考书中保存了一句话:"Java没有处理死锁的机制.它甚至不知道发生了死锁." (Head First Java 2nd Edition,p.516)
那么,它是什么呢?有没有办法在Java中捕获死锁案例?我的意思是,有没有一种方法可以让我们的代码了解发生死锁的情况?
当我尝试使用IBM JDK运行简单的jMockit/JUnit测试时,我得到以下异常.有人遇到过这个问题吗?我试过-Dcom.ibm.tools.attach.enable=yes作为VM参数,但没有运气.相同的代码在Sun JDK中正常工作.
java.lang.RuntimeException: com.sun.tools.attach.AttachNotSupportedException: Unable to enqueue operation: the target VM does not support attach mechanism
at mockit.internal.startup.JDK6AgentLoader.getVirtualMachineImplementationFromEmbeddedOnes(JDK6AgentLoader.java:89)
at mockit.internal.startup.JDK6AgentLoader.loadAgent(JDK6AgentLoader.java:54)
at mockit.internal.startup.AgentInitialization.initializeAccordingToJDKVersion(AgentInitialization.java:21)
at mockit.internal.startup.Startup.initializeIfNeeded(Startup.java:98)
at mockit.internal.startup.Startup.initializeIfPossible(Startup.java:112)
at org.junit.runner.Runner.<clinit>(Runner.java:22)
at java.lang.J9VMInternals.initializeImpl(Native Method)
at java.lang.J9VMInternals.initialize(J9VMInternals.java:200)
at java.lang.J9VMInternals.initialize(J9VMInternals.java:167)
at java.lang.J9VMInternals.initialize(J9VMInternals.java:167)
at org.junit.internal.builders.JUnit4Builder.runnerForClass(JUnit4Builder.java:13)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57)
at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57)
at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:24)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.<init>(JUnit4TestReference.java:33)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestClassReference.<init>(JUnit4TestClassReference.java:25)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createTest(JUnit4TestLoader.java:48)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.loadTests(JUnit4TestLoader.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:452)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: com.sun.tools.attach.AttachNotSupportedException: Unable to enqueue operation: the target VM does not support attach …Run Code Online (Sandbox Code Playgroud) 尝试将代理 jar 文件附加到在 Java 中运行的另一个进程时,我遇到了异常:
com.sun.tools.attach.AttachNotSupportedException: 无法打开套接字文件:目标进程未响应或未加载 HotSpot VM
我正在运行 linux,使用 java Oracle JDK 8_101,但是在回答这个问题之后,我意识到操作系统对于这个问题的原因并不重要。
编辑: 答案:
如果您遇到此问题,我之所以会遇到此问题,是因为我从不同的 JVM 启动程序,而不是为系统指定的默认 JVM。
IE)
程序 A (启动器)运行在JVM-1 (例如 JDK_8_1,或 JDK_8_1/jdk/jre)上。
程序 A (启动器),使用java -jar programB.jar创建一个进程
程序 B (目标)运行在系统的默认 JVM,JVM-2 (例如 JDK_8_2,或 JDK_8_2/jre)上。
方案 一 (启动器) CAN NOT attatch到 程序 乙 (目标),因为JVM方案 一 (启动器)上运行,不匹配的JVM,其中计划 乙 (目标)在其上运行,从而抛出 COM .sun.tools.attach.AttachNotSupportedException: