我正在通过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"
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']
$ jps -v
191594 -Xms128m -Xmx256m
191615 -Xms128m -Xmx256m
我从服务器收到此消息,我不明白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[]>();