Параметр PrintAssembly в точке доступа JVM включен, но не показывает никакой трассировки сборки

Я работаю над Intel i386, Ubuntu 14. Информация о версии OpenJDK, показанная $java -version,

java version "1.7.0_65"
OpenJDK Runtime Environment (IcedTea 2.5.2) (7u65-2.5.2-3~14.04)
OpenJDK Server VM (build 24.65-b04, mixed mode)

Как упоминалось здесь, я скопировал требуемый двоичный файл hsdis-i386.so в следующие места.

/usr/lib/jvm/java-7-openjdk-i386/jre/lib/i386/server

а также

/usr/lib/jvm/java-7-openjdk-i386/jre/lib/i386/client

Затем я перешел к этому блогу, чтобы найти обходной путь и попытаться получить код сборки. Java-программы. Я использовал приведенную ниже команду для тестирования примера Java-программы MyClass.java

java -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly -XX:PrintAssemblyOptions=hsdis-print-bytes -XX:CompileCommand=print,MyClass MyClass

Сообщение, которое я получил на консоли,

OpenJDK Server VM warning: PrintAssembly is enabled; turning on DebugNonSafepoints to gain additional output
CompilerOracle: unrecognized line "print Test"
c = 50

Где MyClass.java

public class MyClass{
  public static void main(String [] args){
    int a = 10;
    int b = 40;
    int c = a + b;
    System.out.println("c = "+c);
  }
}

Согласно моему пониманию и рассмотрению приведенного выше сообщения, jvm может найти hsdis-i386.so и поэтому говорит PrintAssembly is enabled, однако он не показывает никакого ассемблерного кода. Пожалуйста, помогите мне указать на ошибку, которую я делаю.


person user1612078    schedule 27.02.2015    source источник


Ответы (1)


В JVM горячие методы компилируются после многократного запуска. например с -XX:CompileThreshold=10000, который используется по умолчанию, метод будет скомпилирован в собственный код в фоновом режиме через некоторое время после того, как он был вызван 10000 раз.

Ваш код недостаточно запущен для компиляции. Я предлагаю вам использовать -XX:+PrintCompilation, чтобы увидеть, какие методы компилируются.

Когда я запускаю следующее, вывод

$ java -version
java version "1.8.0_25"
Java(TM) SE Runtime Environment (build 1.8.0_25-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode)

но когда я добавляю -XX:+PrintCompliation, я вижу один метод, который компилируется.

$ java -XX:+PrintCompilation -version
java version "1.8.0_25"
Java(TM) SE Runtime Environment (build 1.8.0_25-b17)
     43    1       3       java.lang.String::equals (81 bytes)
Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode)
person Peter Lawrey    schedule 27.02.2015
comment
Ну и какая должна быть команда для этого? Не могли бы вы немного уточнить? - person user1612078; 27.02.2015
comment
Я имею в виду, как мне использовать опцию -XX:+PrintCompilation? - person user1612078; 27.02.2015
comment
@ user1612078 в командной строке, как и другие параметры JVM, которые вы упомянули. - person Peter Lawrey; 27.02.2015
comment
Я пробовал это java -XX:+UnlockDiagnosticVMOptions -XX:+PrintCompilation -XX:PrintAssemblyOptions=hsdis-print-bytes -XX:CompileCommand=print,MyClass MyClass, но ничего не изменилось. - person user1612078; 27.02.2015
comment
@user1612078 user1612078 это другое, попробуйте java -XX:+PrintCompilation -version даже для тривиальной команды вывод будет другим. - person Peter Lawrey; 27.02.2015
comment
Что он должен показать, если я использую опцию -XX:+PrintCompilation? Потому что я также пытался запустить тривиальную команду, но я не знаю, она все еще не показывает ничего другого. - person user1612078; 27.02.2015
comment
@user1612078 user1612078 Я добавил пример, когда он отличается. - person Peter Lawrey; 27.02.2015
comment
Что ж, спасибо, хотя для этой команды ничего не отображается, но да, он показывает, запускаю ли я программу с большим циклом, имеющим более 10000 итераций. - person user1612078; 27.02.2015
comment
Позвольте мне задать еще один вопрос, как я могу изменить CompileThreshold, чтобы он работал для небольшой программы, подобной той, которую я разместил? - person user1612078; 27.02.2015
comment
@ user1612078, вы можете установить меньшее число, вместо этого вы можете попробовать =1. - person Peter Lawrey; 27.02.2015