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

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

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

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

我从 Kenai 下载了 hsdis-amd64.so: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/

名称为:

hsdis-amd64.so
libhsdis-amd64.so
hsdis.so
libhsdis.so

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

...一切都是徒劳。

谷歌搜索结果不再,上述解决方案也不再组合 :-(

有人能帮助我吗?

答案1

首先libhsdis0-fcml按照其他答案1

sudo apt-get install libhsdis0-fcml

这只会为 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

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

strace -f java -XX:CompileCommand='print, *.*' ... |& grep hsdis

得到这样的输出:

[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

您可以看到,您尝试的位置和名称肯定属于 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)

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

答案2

安装包libhsdis0-fcml

apt-get install libhsdis0-fcml

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

相关内容