6

我正在通过 Python 的 pyjnius 包 1.2.0 版运行一些 Java 代码。有几个 Python 进程,每个进程都使用不同的输入调用同一个 Java 类,因此每个进程都会初始化自己的 JVM。我遇到的问题是内存问题,但在研究该问题时,我发现正在运行的 JVM 中的选项与我在 Python 代码中设置的选项不同。

我正在设置选项:

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

Java 代码运行后,我从命令行运行 jps 并得到以下输出:

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

我尝试了不同的参数add_options,并且 jps 总是为每个 JVM 报告第二个参数的两个副本。我也尝试使用set_options并得到相同的结果。

jnius_config.get_options()我在添加选项之前和之后检查了选项是否在 pyjnius 模块本身中设置。

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']

但是当我在 jps 中检查 JVM 时,它们似乎仍然使用错误的选项集运行。其他正在运行的 JVM 报告了不同的选项,所以我认为这在 jps 中不是问题,因为只有通过 pyjnius 运行的进程才会给我返回错误的值。

有谁知道这是否是 pyjnius 中的错误?是否有另一种方法来检查启动 JVM 的选项?


我不确定是否应该信任 jps 或 pyjnius 报告的值,但我在运行 Python 脚本时创建的错误日志中看到以下行:

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

pyjnius 设置了错误的选项,这看起来很有定论。


我对初始内存大小选项进行了一些实验,发现只有在初始内存大小为-Xms100m或更大时才会出现此问题。当我将初始值设置为-Xms99m或更低时,jps 会报告我设置的相同值。

4

1 回答 1

0

也许您应该尝试提供一个简单的最小可重现示例,该示例可用于重现该行为。

快速检查后按预期工作。

使用的软件版本

$ python -V
Python 3.8.2
$ java -version
java version "1.8.0_202"
  • 创建一个新的 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
    
于 2020-04-30T14:11:05.890 回答