问题描述
我正在尝试使用 jprofiler 12.0.3 设置一个 alpine linux docker 容器,以便我可以远程连接到它。
在我的Dockerfile
中:
FROM adoptopenjdk/openjdk11-openj9:alpine-slim
...
RUN wget https://download-gcdn.ej-technologies.com/jprofiler/jprofiler_linux_12_0_3.tar.gz -P /jprofiler/ && tar -xzf jprofiler_linux_12_0_3.tar.gz -C /jprofiler && rm /jprofiler/jprofiler_linux_12_0_3.tar.gz
ENTRYPOINT ["./startup.sh"]
在我的 startup.sh
文件中:
...
JAVA_OPTS="$JAVA_OPTS -agentpath:/jprofiler/jprofiler12.0.3/bin/linux_musl-x64/libjprofilerti.so=port=8849,Nowait"
...
但是,当我使用上面的 Dockerfile 构建并运行 docker 映像时,我得到:
Starting app with JAVA_OPTS: -agentpath:/jprofiler/jprofiler12.0.3/bin/linux_musl-x64/libjprofilerti.so=port=8849,Nowait
jprofiler> Protocol version 64
jprofiler> Thread status info workaround enabled.
jprofiler> OpenJ9 jvmti version 1.1 detected.
jprofiler> Java 11 detected.
jprofiler> Don't wait for frontend to connect.
jprofiler> 64-bit library (musl)
jprofiler> Could not locate the config file.
jprofiler> Please specify config=[config filename].
jprofiler> If you are running jprofiler's frontend on a different
jprofiler> machine you have to copy the file jprofiler_config.xml to this
jprofiler> computer. The file is located in $HOME/.jprofiler12 or
jprofiler> in C:\Users\[username]\.jprofiler12.
如果我将基本图像更改为热点图像,例如:
FROM adoptopenjdk:11-jre-hotspot-focal
...
RUN wget https://download-gcdn.ej-technologies.com/jprofiler/jprofiler_linux_12_0_3.tar.gz -P /jprofiler/ && tar -xzf jprofiler_linux_12_0_3.tar.gz -C /jprofiler && rm /jprofiler/jprofiler_linux_12_0_3.tar.gz
ENTRYPOINT ["./startup.sh"]
然后startup.sh
:
...
JAVA_OPTS="$JAVA_OPTS -agentpath:/jprofiler/jprofiler12.0.3/bin/linux_musl-x64/libjprofilerti.so=port=8849,Nowait"
...
我得到了以下输出,我可以使用 jprofiler 远程连接到这个 JVM:
Starting app with JAVA_OPTS: -agentpath:/jprofiler/jprofiler12.0.3/bin/linux-x64/libjprofilerti.so=port=8849,Nowait
jprofiler> Protocol version 64
jprofiler> Java 11 detected.
jprofiler> Don't wait for frontend to connect.
jprofiler> 64-bit library
jprofiler> Starting up without initial configuration.
jprofiler> Listening on port: 8849.
jprofiler> Enabling native methods instrumentation.
jprofiler> Can retransform classes.
jprofiler> Can retransform any class.
jprofiler> Native library initialized
jprofiler> VM initialized
jprofiler> Retransforming 162 base class files.
jprofiler> Base classes instrumented.
您是否知道为什么 alpine 映像会出现这种情况,以及是否有任何方法可以解决此配置文件问题?
解决方法
区别在于 OpenJ9 和 Hotspot VM 之间。对于 OpenJ9,JProfiler 需要在启动时进行分析设置,因此您必须为 -agentpath 参数指定“config”选项。
您可以使用远程集成向导(会话->集成向导->新建远程集成)集成来获取有关设置的帮助。