【问题标题】:Instantiating java array with maximum size [duplicate]实例化具有最大大小的java数组[重复]
【发布时间】:2017-12-20 04:34:11
【问题描述】:

我想知道如何在 Java 中以最大可能的长度实例化一个 long[] 数组。如果它太大,我会得到一个内存错误。我需要这个数组尽可能大而不超过平台相关限制。如何才能做到这一点?我的计算机上的限制似乎是大约 85000000 个索引,但在其他计算机上可能会更少或更多。

【问题讨论】:

  • long 有:java.lang.Long 类:min = -9,223,372,036,854,775,808,max = 9,223,372,036,854,775,807
  • 这怎么可能有用?
  • 你需要这个……?
  • 我正在编写一个国际象棋算法,这个数组将是一个转置表。数组越大,运行速度越快。
  • 为自己分配所有可用内存是危险的。请记住,除了您编写的应用程序代码之外,Java 程序中还会发生其他事情。许多这些东西也动态分配内存,如果你把它全部吸完,它们就会中断。您应该寻找更灵活的解决方案,例如WeakHashMapWeakHashMap 可以变大,但也可以响应其他事物的内存需求而缩小。

标签: java arrays out-of-memory


【解决方案1】:

在 Java 中,垃圾收集将以不可预测的间隔运行。因此,可用堆内存大小将根据运行时增加或减少。因此,您不太可能获得可用于制作长数组的确切内存字节,但您可以尝试使用 Runtime 类获取用于 JVM 的内存详细信息:
Runtime.getRuntime().totalMemory(),
@ 987654322@,
Runtime.getRuntime().maxMemory()

【讨论】:

  • 我纠正那个 Runtime.getRuntime().freeMemory()/8;应该给我数组的近似最大长度吗?如果是这样,它似乎给了我大约 3000 万的长度,远低于我预期的 8500 万。
  • 是的,但它不是可以达到的最大值,因为堆以 -Xms 开关指定的大小开始,并且可以增长到 -Xmx 指定的大小。 freeMemory() 只为您提供当前堆大小的空闲内存。
【解决方案2】:

独立于问题,如何计算出最大可用空间可能是多少: 如果你真的只需要那个数组中的 long,你也可以考虑使用 java.nio.LongBuffer。由于您在机器附近工作,因此使用它与在 C 中使用 C 数组但使用安全语言工作非常相似。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-03
    • 1970-01-01
    • 2016-04-23
    • 2016-07-31
    相关资源
    最近更新 更多