gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 11:12:05 24 4
gpt4 key购买 nike

我们有用 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.7Java:1.8 或 1.7(64 位或 32 位)

谢谢。

最佳答案

JVM 消耗的内存包括 2 个主要区域:

  1. 堆内存
  2. 非堆内存 - MetaSpace , native method stacks , pc register ,直接字节缓冲区,套接字,jni 分配的内存,thread stacks等等

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

关于java - JPype/Java - 使用或获取剩余堆空间进行初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27068092/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com