Почему Pyjnius устанавливает неправильные параметры JVM? - PullRequest
6 голосов
/ 21 апреля 2020

Я использую код Java в пакете Python pyjnius, версия 1.2.0. Существует несколько процессов Python, каждый из которых вызывает один и тот же класс Java с разными входами, поэтому каждый из них инициализирует свою собственную JVM. У меня проблема с памятью, но, изучая ее, я обнаружил, что параметры работающих JVM не совпадают с параметрами, установленными в моем коде Python.

I Я устанавливаю параметры с помощью:

jnius_config.add_options('-Xms512m', '-Xmx1280m')

После запуска кода Java я запускаю jps из командной строки и получаю следующий вывод:

C:\>jps -lvm
25140  -Xmx1280m -Xmx1280m
24684  -Xmx1280m -Xmx1280m

Я пробовал разные аргументы add_options, а jps всегда сообщает о двух копиях второго аргумента для каждой из JVM. Я также попытался использовать set_options и получил те же результаты.

Я проверил, что параметры установлены в самом модуле pyjnius, используя jnius_config.get_options() до и после добавления параметров.

print("Initial options:", jnius_config.get_options())
jnius_config.add_options('-Xms512m', '-Xmx1280m')
print("Configured options:", jnius_config.get_options())

Он сообщает о тех же значениях, которые я установил.

Initial options: []
Configured options: ['-Xms512m', '-Xmx1280m']

Но JVM по-прежнему работают с неверными настройками, когда я проверяю их в jps. Другие работающие JVM сообщают о других параметрах, поэтому я не думаю, что это проблема в jps, поскольку только процессы, выполняемые через pyjnius, возвращают мне неправильные значения.

Кто-нибудь знает, если это ошибка в pyjnius? Есть ли другой способ проверить параметры, с которыми была запущена JVM?


Я не был уверен, стоит ли доверять значениям, указанным jps или pyjnius, но я вижу следующие строки в журнале ошибок создан при запуске моего Python сценария:

VM Arguments:
jvm_args: -Xmx1280m -Xmx1280m
java_command: <unknown>

Кажется довольно убедительным, что pyjnius устанавливает неправильные параметры.


Я немного поэкспериментировал с исходным параметром размера памяти и обнаружил, что эта проблема существует только тогда, когда начальный объем памяти -Xms100m или больше. Когда я устанавливаю начальное значение на -Xms99m или ниже, jps сообщает о тех же значениях, которые я установил.

1 Ответ

0 голосов
/ 30 апреля 2020

Возможно, вам следует попытаться предоставить простой минимально-воспроизводимый пример , который можно использовать для воспроизведения поведения.

После быстрой проверки все работало, как и ожидалось.

используемые версии программного обеспечения

$ python -V
Python 3.8.2
$ java -version
java version "1.8.0_202"
  • создайте fre sh Python venv и выполните pip install pyjnius==1.2.0
  • проверьте версию установленных пакетов

    $ pip freeze
    Cython==0.29.17
    pyjnius==1.2.0
    six==1.14.0
    
  • создать минимальный пример minimal.py

    import jnius_config
    
    print("Initial options:", jnius_config.get_options())
    jnius_config.add_options('-Xms128m', '-Xmx256m')
    print("Configured options:", jnius_config.get_options())
    
    from jnius import autoclass
    Thread = autoclass('java.lang.Thread')
    Thread.sleep(60_000)
    
    System = autoclass('java.lang.System')
    System.out.println('Hello World')
    
  • запустить пример два раза

    session 1 $ python minimal.py 
    Initial options: []
    Configured options: ['-Xms128m', '-Xmx256m']
    
    session 2 $ python minimal.py 
    Initial options: []
    Configured options: ['-Xms128m', '-Xmx256m']
    
  • проверка выполнения Java процессов

    $ jps -v
    191594  -Xms128m -Xmx256m
    191615  -Xms128m -Xmx256m
    
...