【问题标题】:Why is pyjnius setting the wrong JVM options?为什么 pyjnius 设置了错误的 JVM 选项?
【发布时间】:2020-08-03 14:15:21
【问题描述】:

我正在通过 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 会报告我设置的相同值。

【问题讨论】:

  • 您能否添加更多信息,当您在命令jnius_config.add_options('-Xms512m', '-Xmx1280m') 之前和之后添加print(jnius_config.get_options()) 时会发生什么?
  • 嗨@ands。我在问题中添加了这些行和其他一些细节。
  • 文档说:需要在调用 import jnius 之前设置 JVM 选项,因为它们在 VM 启动后无法更改。
  • @Voodoo 我在导入 jnius 之前在单独的初始化函数中设置选项。
  • 你能发布整个错误日志吗?另外,我对 pyjnius 和 JVM 不是很熟悉,但是你可以直接在命令行中使用参数-Xms512m -Xmx1280m 运行这个程序吗?

标签: java python pyjnius


【解决方案1】:

也许您应该尝试提供一个简单的minimal-reproducible-example,它可以用来重现该行为。

快速检查后按预期工作。

使用的软件版本

$ 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
    

【讨论】:

    猜你喜欢
    • 2011-06-25
    • 1970-01-01
    • 2016-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多