java-8-oracle (1.8.0_66) PrintAssembly 问题“无法加载 hsdis-amd64.so”

Pio*_*ski 22 java jdk oracle

我正在尝试使用-XX:+PrintAssembly选项运行我的程序,但我总是收到如下消息:

Java HotSpot(TM) 64 位服务器 VM 警告:PrintAssembly 已启用;打开 DebugNonSafepoints 以获得额外输出无法加载 hsdis-amd64.so;库无法加载;PrintAssembly 被禁用

我下载了hsdis-amd64.so从Kenai:https://kenai.com/projects/base-hsdis/downloads

我自己用http://sourceforge.net/projects/fcml/files/fcml-1.1.1/项目构建了这个库。

我把它放在任何地方“谷歌说”:

/usr/lib/jvm/java-8-oracle/jre/lib/amd64/server/
/usr/lib/jvm/java-8-oracle/jre/lib/amd64/
/usr/lib/jvm/java-8-oracle/lib/amd64/
Run Code Online (Sandbox Code Playgroud)

名称:

hsdis-amd64.so
libhsdis-amd64.so
hsdis.so
libhsdis.so
Run Code Online (Sandbox Code Playgroud)

我什至尝试过设置手动导出 LD_LIBRARY_PATH=/usr/lib/jvm/java-8-oracle/jre/lib/amd64/server/

......一切都白费了。

没有更多的谷歌结果,不再有上述解决方案的组合:-(

任何人都可以帮助我吗?

Bee*_*ope 11

首先libhsdis0-fcml按照其他答案1中的描述进行安装:

sudo apt-get install libhsdis0-fcml
Run Code Online (Sandbox Code Playgroud)

这只会为 OpenJDK 安装它。但是,您正在使用java-8-oracle,因此您需要将其复制到那里。这是对我有用的确切复制命令:

sudo cp /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/amd64/hsdis-amd64.so /usr/lib/jvm/java-8-oracle/jre/lib/amd64/hsdis-amd64.so
Run Code Online (Sandbox Code Playgroud)

如果这仍然不起作用,您可以尝试strace查看您java正在寻找的位置。我用了:

strace -f java -XX:CompileCommand='print, *.*' ... |& grep hsdis
Run Code Online (Sandbox Code Playgroud)

得到这样的输出:

[pid 10783] open("/usr/lib/jvm/java-8-oracle/jre/lib/amd64/server/libhsdis-amd64.so", O_RDONLY <unfinished ...>
[pid 10783] open("/usr/lib/jvm/java-8-oracle/jre/lib/amd64/server/libhsdis-amd64.so", O_RDONLY|O_CLOEXEC <unfinished ...>
[pid 10783] open("/usr/lib/jvm/java-8-oracle/jre/lib/amd64/server/libhsdis-amd64.so", O_RDONLY|O_NONBLOCK <unfinished ...>
[pid 10783] open("/usr/lib/jvm/java-8-oracle/jre/lib/amd64/server/hsdis-amd64.so", O_RDONLY <unfinished ...>
[pid 10783] open("/usr/lib/jvm/java-8-oracle/jre/lib/amd64/server/hsdis-amd64.so", O_RDONLY|O_CLOEXEC <unfinished ...>
[pid 10783] open("/usr/lib/jvm/java-8-oracle/jre/lib/amd64/server/hsdis-amd64.so", O_RDONLY|O_NONBLOCK <unfinished ...>
[pid 10783] open("/usr/lib/jvm/java-8-oracle/jre/lib/amd64/hsdis-amd64.so", O_RDONLY <unfinished ...>
[pid 10783] open("/usr/lib/jvm/java-8-oracle/jre/lib/amd64/hsdis-amd64.so", O_RDONLY|O_CLOEXEC) = 14
Run Code Online (Sandbox Code Playgroud)

您可以看到您尝试的地点和名称肯定在 JDK 搜索中(在我的情况下,它可能会搜索更多的地方,但由于上面的最后一个位置是它找到共享对象的位置而停止)。

请注意,您肯定需要该-f标志,strace因为实际的 JVM 是作为原始java命令的子进程启动的。

strace可能揭示的问题之一是权限问题。我只需要在库上读取权限供用户启动java.

我的java -version输出:

java version "1.8.0_151"
Java(TM) SE Runtime Environment (build 1.8.0_151-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.151-b12, mixed mode)
Run Code Online (Sandbox Code Playgroud)

1真的,这只是一种以hsdis.so包管理器友好的方式获取(可能有效)文件的方法。您也可以直接从各种来源之一下载它。


Kam*_*mil 5

安装包libhsdis0-fcml

apt-get install libhsdis0-fcml
Run Code Online (Sandbox Code Playgroud)

它应该提供所有必要的库(参见http://packages.ubuntu.com/xenial/amd64/libhsdis0-fcml/filelist