pyjnius为什么设置了错误的JVM选项? - java

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

参考方案

也许您应该尝试提供一个简单的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
    
  • Java-如何将此字符串转换为日期? - java

    我从服务器收到此消息,我不明白T和Z的含义,2012-08-24T09:59:59Z将此字符串转换为Date对象的正确SimpleDateFormat模式是什么? java大神给出的解决方案 这是ISO 8601标准。您可以使用SimpleDateFormat simpleFormat = new SimpleDateFormat("yyyy-MM…

    Java:找到特定字符并获取子字符串 - java

    我有一个字符串4.9.14_05_29_16_21,我只需要获取4.9。数字各不相同,所以我不能简单地获得此char数组的前三个元素。我必须找到最正确的.并将其子字符串化直到那里。我来自Python,因此我将展示Python的实现方法。def foobar(some_string): location = some_string.rfind('.&…

    Java:正则表达式模式匹配器是否有大小限制? - java

    我的模式类似于OR:“word1 | word2 | word3”我大约有800个字。可能有问题吗? 参考方案 您仅受记忆和理智的限制。 :)

    Java:线程池如何将线程映射到可运行对象 - java

    试图绕过Java并发问题,并且很难理解线程池,线程以及它们正在执行的可运行“任务”之间的关系。如果我创建一个有10个线程的线程池,那么我是否必须将相同的任务传递给池中的每个线程,或者池化的线程实际上只是与任务无关的“工人无人机”可用于执行任何任务?无论哪种方式,Executor / ExecutorService如何将正确的任务分配给正确的线程? 参考方案 …

    Java:我可以在Hashmaps中使用数组吗? - java

    我可以在Hashmaps中使用数组吗?如果是这样,则声明这种哈希图的确切语法是什么?谢谢 参考方案 数组也是对象。甚至像int[]这样的原始数组。Map<String,String[]> map = new HashMap<String,String[]>();