Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JPype/Java-使用或获取剩余堆空间进行初始化_Java_Python_Memory_Jvm_Jpype - Fatal编程技术网

JPype/Java-使用或获取剩余堆空间进行初始化

JPype/Java-使用或获取剩余堆空间进行初始化,java,python,memory,jvm,jpype,Java,Python,Memory,Jvm,Jpype,我们有用Python编写的软件,它使用JPype调用Java,Java执行各种资源密集型计算/报表生成。我们最初在启动JVM时分配了800mb的堆空间。java端是完全多线程的,可以使用任何可用的资源 jvmArgs = ["-Djava.class.path=" + classpath, "-Xmx800M"] jpype.startJVM(u"java\\jre8\\bin\\client\\jvm.dll", *jvmArgs) 在我们为遗留客户端在Windows XP上进行测试之前,这

我们有用Python编写的软件,它使用JPype调用Java,Java执行各种资源密集型计算/报表生成。我们最初在启动JVM时分配了800mb的堆空间。java端是完全多线程的,可以使用任何可用的资源

jvmArgs = ["-Djava.class.path=" + classpath, "-Xmx800M"]
jpype.startJVM(u"java\\jre8\\bin\\client\\jvm.dll", *jvmArgs)
在我们为遗留客户端在Windows XP上进行测试之前,这种方法一直运行良好。新机器是Win 7 64位,内存为4GB,而旧机器是Win XP 32位,内存仅为2GB

问题是,如果分配了太多内存,JPype会导致应用程序不正常地、静默地崩溃。上面的语句甚至不会触发try-catch

我想知道是否有一种方法可以从命令行使用java来确定我们可以在计算机上分配多少内存。我们可以检查它是32位还是64位,这会有所帮助,但我们需要确保它们没有运行占用JVM堆空间的其他程序。如果是,我们的应用程序将崩溃

读者文摘:我们希望在初始化JVM时分配500mb的堆空间,但不能确定当前使用了多少空间。如果我们分配太多,整个应用程序就会自动崩溃

我们使用以下方法 JPype:0.5.4.2 Python:2.7 Java:1.8或1.7(64位或32位)


谢谢。

JVM消耗的内存由两个主要区域组成:

  • 堆内存
  • 非堆内存-、直接字节缓冲区、套接字、jni分配内存等
  • 虽然堆内存使用的最大大小是已知的且可配置的,但非堆内存的大小无法完全控制。
    JVM使用的本机内存的大小将受您使用的线程数、加载的类的数量和缓冲区的使用(I/O的使用)的影响。
    您可以通过设置MaxMetaspaceSize(-XX:MaxMetaspaceSize)来限制metapsace的大小。通过限制线程数量和设置线程堆栈大小(-Xss),可以控制线程堆栈使用的内存量。
    假设没有本机内存泄漏,加载的类数量是稳定的(没有过度使用动态代理和字节码生成)使用的线程数量是已知的——您可以通过监视JVM在一段时间内使用的总体内存来推测应用程序运行需要多少内存。执行此操作时,请确保在JVM启动时分配整个堆。

    最后,我们决定为XP找到一个安全的堆数500M,为Win 7找到一个安全的堆数800M。这是一个肮脏的解决方案,但目前还有效。这也许是一个过于宽泛的问题。这一切背后的问题是,如果分配太多,JPype会导致崩溃。我想我们可以通过确定什么是可用的来避免它。最后有点太复杂了。