java-8-oracle (1.8.0_66) проблема с PrintAssembly «Не удалось загрузить hsdis-amd64.so»


20

Я пытаюсь запустить мои программы с -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, нет больше комбинации вышеуказанных решений :-(

Кто-нибудь может мне помочь?

Ответы:


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 (в моем случае он, вероятно, искал бы больше мест, но остановился, поскольку в последнем расположении, указанном выше, находился общий объект).

Обратите внимание, что вам определенно нужен -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файл дружественным для менеджера пакетов способом. Вы всегда можете просто скачать его прямо из одного из различных источников.


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.