我正在尝试使用-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)