当运行jpenable以允许在运行JDK 8的alpine:3.3容器中对Jprofiler10进行性能分析时,出现UnsatisfiedLinkError异常。有任何想法吗?
ERROR: The agent could not be loaded: Picked up _JAVA_OPTIONS: -Xmx1024m
Exception in thread "main" java.lang.UnsatisfiedLinkError: /opt/jprofiler10/bin/
linux-x64/libattach.so: Error relocating /opt/jprofiler10/bin/linux-x64/libattac
h.so: __strcpy_chk: symbol not found
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1941)
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1824)
at java.lang.Runtime.load0(Runtime.java:809)
at java.lang.System.load(System.java:1086)
at com.jprofiler.attach.b.b.b.load(ejt:6)
at com.jprofiler.attach.b.b.i.loadLibraryPath(ejt:49)
at com.jprofiler.attach.a.b(ejt:92)
at com.jprofiler.attach.a.a(ejt:74)
at com.jprofiler.attach.a.main(ejt:116)
最佳答案
因此,我将回答我自己的问题。
首先-我注意到ldd显示了alpine:3.5 openjdk8-jre包中的Java本机库的MOST已损坏(不解析依赖库)。我在这里找到了配置负载库路径的解决方案:https://github.com/docker-library/openjdk/issues/77
使用以下内容创建/etc/ld-musl-x86_64.path可以解决我在ldd中发现的大多数库问题。
/lib
/usr/lib
/usr/local/lib
/usr/lib/jvm/java-1.8-openjdk/jre/lib/amd64
/usr/lib/jvm/java-1.8-openjdk/jre/lib/amd64/jli
/usr/lib/jvm/java-1.8-openjdk/jre/lib/amd64/server
/opt/jprofiler10.1.1/bin/linux-x64/
但是,Jprofiler10 tar文件中提供的/opt/jprofiler10.1.1/bin/linux-x64/libattach.so仍然损坏,因此我将其删除-并使用了/ usr / lib / jvm / java中包含的libattach.so。 -1.8-openjdk / jre / lib / amd64目录。
以下Dockerfile显示了我如何构建容器-并修复了问题。
FROM alpine:3.5
RUN apk --no-cache add \
openjdk8-jre-base \
libstdc++
COPY ld-musl-x86_64.path /etc/ld-musl-x86_64.path
ADD jprofiler_linux_10_1_1.tar /opt/
RUN rm /opt/jprofiler10.1.1/bin/linux-x64/libattach.so
之后-我能够将容器放到牧场主那里。
最后的步骤是将Shell执行到容器中并运行jpenable以启用Jprofiler工具创建与jvm的连接。
例如/opt/jprofiler10.1.1/bin/jpenable
然后,我可以在端口8849上进行连接并分析应用程序。