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)

Другие вопросы по тегам