Java CRaC возобновляет работу с контрольной точки с аргументами

Я экспериментирую с CRaC на Azul JVM. Я построил контрольную точку своей программы с помощью

      $JAVA_CMD -XX:CRaCCheckpointTo=cr -jar target/cractest-0.1.0-standalone.jar

И я могу успешно восстановить его с помощью

      $JAVA_CMD -XX:CRaCRestoreFrom=cr

Все работает. На следующем шаге я хочу передать аргументы программе при восстановлении, чтобы программа могла их подобрать, в идеале, как показано ниже:

      $JAVA_CMD -XX:CRaCRestoreFrom=cr -- arg1 arg2 arg3

И обычно я бы получил доступarg1 arg2 arg3вString[] argsпараметрmain, но поскольку мы возобновляем контрольную точку, у нас больше нет доступа к этому массиву.

Как я могу получить доступ к параметрам восстановления контрольной точки? Доступен ли он в каком-либо объекте контекста во время выполнения?

2 ответа

CRaC работает не так. Вы должны думать об этом как о работающем приложении, которое было приостановлено. Точно так же, как вы не можете изменить аргументы наmain()работающего приложения, вы не можете сделать это с помощью CRaC.

Что вы можете сделать, это использоватьafterRestore()метод класса, который реализуетResourceинтерфейс и читать новые значения из какого-либо источника (например, файла).

Теоретически вы можете реализовать эту функциональность, добавив в свою программу ресурс, который будет читать аргументы из файла и вызывать некоторый Java-код. А потом, перед восстановлением, записать параметры в файл.

Все это выглядит достаточно общим, чтобы его можно было реализовать в JDK. Итак, поскольку https://github.com/openjdk/crac/pull/16 вы можете передать имя класса и аргументы для запуска при восстановлении. Пожалуйста, проверьте прилагаемый JavaCompilerCRaC.java.

Возможность запуска некоторого Java-кода предназначена для выполнения некоторых действий после восстановления. Например, установка каких-то параметров и т.п. Командная строка выглядит так:

      java -XX:CRaCRestoreFrom=cr ClassName arg1 arg2 ...

CRaC позволяет устанавливать свойства при восстановлении с помощью

      java -XX:CRaCRestoreFrom=cr -DpropName=propValue

Но вы можете реализовать это самостоятельно:

      public class Props {
    public static void main(String[] args) throws Exception {
        for (int i = 0; i < args.length; i += 2) {
            System.setProperty(args[i], args[i + 1]);
        }
        printProperties();
    }
}
      java -XX:CRaCRestoreFrom=cr Props propName propValue

Таким образом, предел — это то, что вы можете выразить с помощью Java-кода.

Будем признательны за отзывы об этой функциональности.

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