java-8-oracle (1.8.0_66) проблема с PrintAssembly "Не удалось загрузить hsdis-amd64.so"
Я пытаюсь запустить свои программы с -XX:+PrintAssembly
варианты, но я всегда получаю сообщение как:
Предупреждение о виртуальной машине на 64-разрядном сервере Java HotSpot(TM): 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/.
Я положил его везде "Google говорит":
/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/
... и все впустую.
Нет больше результатов Google, нет больше комбинации вышеуказанных решений:-(
Кто-нибудь может мне помочь?
2 ответа
Первая установка 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
файл в менеджере пакетов дружественным способом. Вы всегда можете просто скачать его прямо из одного из различных источников.
Установить пакет libhsdis0-fcml
:
apt-get install libhsdis0-fcml
Он должен предоставить все необходимые библиотеки (см. http://packages.ubuntu.com/xenial/amd64/libhsdis0-fcml/filelist)