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


20

我正在尝试使用-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/ project 构建了这个库。

我把它放在“谷歌说”的各处:

/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/

...一无所有。

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

谁能帮助我?

Answers:


10

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搜索中的(在我的情况下,它可能会搜索更多位置,但是由于上面的最后一个位置是它找到共享对象的位置而停止了)。

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

其中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软件包管理器友好的方式获取(可能正在工作的)文件的一种方法。您也总是可以直接从各种来源之一直接下载它。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.