Java Web Start (JWS) 内存管理在 32 位和 64 位中似乎有所不同

标签 java java-8 heap-memory java-web-start jnlp

我们正在开发一个作为 Java Web Start 应用程序运行的(大型)系统。因此,用户下载 JNLP 文件,并在他或她的计算机上运行它。

我们遇到了一些用户声称应用程序在打开几个窗口时挂起的问题。我们做了一些测试,原因很明确且可重复:

  • 如果用户使用 32 位 JVM 打开 JNLP 文件,最大内存将保持在 256 MB,一旦超过此阈值,应用程序的可用内存将变为 0% 并挂起。
  • 如果同一用户使用 64 位 JVM 打开同一个 JNLP 文件,最大内存从 256 MB 开始,但随着系统需要更多内存,JVM 会自由保留和使用它,如果需要,最多可达 1 GB 以上.

我们进行了多次测试,情况都是一样的。

有没有办法让 32 位 JVM 的行为与 64 位完全相同?我知道我们可以设置最大堆大小,但最终用户可能有 1GB、2GB 或 3GB 的可用内存,我们希望他或她能够在需要时使用它们,这正是 64 位发生的情况.

我们正在使用 Java 8,更新 201。

应用程序的内存需求取决于您打开的窗口数量。对于正常使用,256MB-512MB 就足够了,但一些用户会受益于能够打开 7-10 个屏幕,并且 RAM 可能高达 800MB-1GB。

最佳答案

您应该在the JNLP file中指定应用程序所需的内存。使用 max-heap-size 参数并且不依赖于客户端系统:

<java version="1.8" initial-heap-size="256m" max-heap-size="1024m"/>

在大多数情况下,默认 JVM 堆是 at most 25% of the available system memory 。如果某些用户只有 1GB RAM,那么如果您不自己指定,他们将永远不会获得超过 256 MB 的堆。

请注意,由于您支持 32 位 JVM,因此内存不能超过 2 GB。

关于Java Web Start (JWS) 内存管理在 32 位和 64 位中似乎有所不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54693235/

相关文章:

c++ - 我的栈内存空间膨胀了吗?

java - 如何在使用 Criteria 的查询中构建 hibernate 多重限制

java - 提交按钮上的 request.getParameter 给出空值

java - RxJava Single<> 带有计数、谓词和延迟

java - 使用 Java Streams 从嵌套列表创建 TreeMap

java - 在Java 8中,接口(interface)默认方法可以访问实例变量吗?

spring-boot - Rest Assured 不使用自定义 ObjectMapper

java - "on-heap"和 "off-heap"之间的区别

c - 解除分配多个内存指针的最方便的方法?

java - 如何将文件保存到 Android 中的任何特定路径