Eclipse Oxygen(4.7)中通过JMC 6启动Flight Recorder失败求助
解决Eclipse Oxygen中JMC启动Flight Recorder时的权限拒绝错误
我之前在使用Eclipse Oxygen(4.7)搭配JMC插件启动Flight Recorder时也遇到过完全一样的问题,先把你碰到的异常贴出来方便大家定位:
com.oracle.jmc.rjmx.services.jfr.FlightRecorderException: Could not start the recording! at com.oracle.jmc.rjmx.services.jfr.internal.FlightRecorderServiceV1.start(FlightRecorderServiceV1.java:149) at com.oracle.jmc.flightrecorder.controlpanel.ui.jobs.StartRecordingJob.run(StartRecordingJob.java:76) at org.eclipse.core.internal.jobs.Worker.run(Worker.java:56) Caused by: java.io.IOException: javax.management.openmbean.OpenDataException: recording.jfr (Access denied) at com.oracle.jmc.rjmx.services.jfr.internal.FlightRecorderCommunicationHelperV1.invokeOperation(FlightRecorderCommunicationHelperV1.java:62) at com.oracle.jmc.rjmx.services.jfr.internal.FlightRecorderServiceV1.start(FlightRecorderServiceV1.java:137) ... 2 more Caused by: javax.management.MBeanException: javax.management.openmbean.OpenDataException: recording.jfr (Access denied) at com.sun.jmx.mbeanserver.MBeanIntrospector.unwrapInvocationTargetException(MBeanIntrospector.java:313) at com.sun.jmx.mbeanserver.MBeanIntrospector.invokeM(MBeanIntrospector.java:239) at com.sun.jmx.mbeanserver.PerInterface.invoke(PerInterface.java:138) at com.sun.jmx.mbeanserver.MBeanSupport.invoke(MBeanSupport.java:252) at javax.management.StandardMBean.invoke(StandardMBean.java:405) at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819) at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801) at javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1468) at javax.management.remote.rmi.RMIConnectionImpl.access$300(RMIConnectionImpl.java:76) at javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1309) at javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1401) at javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:829) at sun.reflect.GeneratedMethodAccessor41.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:361) at sun.rmi.transport.Transport$1.run(Transport.java:200) at sun.rmi.transport.Transport$1.run(Transport.java:197) at java.security.AccessController.doPrivileged(Native Method) at sun.rmi.transport.Transport.serviceCall(Transport.java:196) at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:568) at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:826) at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:683) at java.security.AccessController.doPrivileged(Native Method) at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:682) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:283) at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:260) at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:161) at com.sun.jmx.remote.internal.PRef.invoke(Unknown Source) at javax.management.remote.rmi.RMIConnectionImpl_Stub.invoke(Unknown Source) at javax.management.remote.rmi.RMIConnector$RemoteMBeanServerConnection.invoke(RMIConnector.java:1020) at com.oracle.jmc.rjmx.internal.MCMBeanServerConnection.invoke(MCMBeanServerConnection.java:224) at com.oracle.jmc.rjmx.ConnectionToolkit.invokeOperation(ConnectionToolkit.java:152) at com.oracle.jmc.rjmx.services.jfr.internal.FlightRecorderCommunicationHelperV1.invokeJfrOperation(FlightRecorderCommunicationHelperV1.java:69) at com.oracle.jmc.rjmx.services.jfr.internal.FlightRecorderCommunicationHelperV1.invokeOperation(FlightRecorderCommunicationHelperV1.java:56) ... 3 more Caused by: javax.management.openmbean.OpenDataException: recording.jfr (Access denied) at oracle.jrockit.jfr.FlightRecorder.setRecordingOptions(FlightRecorder.java:221) at oracle.jrockit.jfr.FlightRecorder.setRecordingOptions(FlightRecorder.java:230) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at sun.reflect.misc.Trampoline.invoke(MethodUtil.java:71) at sun.reflect.GeneratedMethodAccessor27.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at sun.reflect.misc.MethodUtil.invoke(MethodUtil.java:275) at com.sun.jmx.mbeanserver.StandardMBeanIntrospector.invoke
核心原因
这个错误的关键信息是recording.jfr (Access denied)——JFR默认尝试在当前工作目录生成录制文件,但你的Eclipse或目标JVM进程没有该目录的写入权限。
解决办法
指定有写入权限的自定义路径:
在Eclipse的JFR启动控制面板里,找到「Recording File」选项,手动输入一个你有权限读写的路径,比如:- Windows:
C:\Users\你的用户名\Documents\JFR_Recordings\my_app_recording.jfr - Linux/macOS:
/home/你的用户名/jfr_recordings/my_app_recording.jfr
注意:如果路径里的文件夹不存在,得先手动创建好,JFR不会自动生成文件夹。
- Windows:
使用系统临时目录(快速测试用):
临时目录一般默认开放读写权限,你可以直接填:- Windows:
%TEMP%\test_recording.jfr - Linux/macOS:
/tmp/test_recording.jfr
- Windows:
检查进程权限:
如果是监控本地Java程序,确保启动Eclipse的用户对目标路径有读写权限;如果是远程JVM,要确认远程服务器上的JVM运行用户有权限写入你指定的远程路径(或者先录制到远程临时目录,再下载到本地)。
额外提醒
别把录制路径设为系统级目录(比如C:\Windows、/usr),这些目录普通用户通常没有写入权限,很容易触发权限拒绝错误。
内容的提问来源于stack exchange,提问作者Christian
相关产品推荐
相关产品推荐

