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

BeeOnRope
источник