【发布时间】:2021-09-28 00:03:27
【问题描述】:
任务
分配 X=4..8MB 的字节数组(在堆上),例如使用 ByteBuffer.allocate() 这样它就不会导致 OutOfMemoryError。不允许拆分阵列并以较小的部分对其进行处理。请注意,分配发生在堆上,这不是直接的 ByteBuffer。
挑战
- 内存可以碎片化,如果有足够的内存(大于 X),可能仍然无法分配大小为 X 字节的连续部分来分配数组(任何 API 来找出是否存在 X 字节的连续区域可能会有帮助)。
- 堆内存被划分为区域来保存不同代的对象,一个对象不能跨越堆的两个或更多区域:Huge arrays throws out of memory despite enough memory available和Large Array allocation across young and tenured portions of java Heap
- 大对象会立即分配到一个永久区域中,但即使使用
ManagementFactory.getMemoryPoolMXBeans(),也很难可靠地推断出究竟是哪个区域:how can I know size of each generation in java heap with jmx 一些 JVM 动态调整 LOA:https://www.ibm.com/docs/en/sdk-java-technology/8?topic=SSYKE2_8.0.0/com.ibm.java.vm.80.doc/docs/mm_allocation_loa.html
问题
Java 中有没有办法编写如下代码?
if (<I can reliably allocate an array sized X bytes on heap right now>) {
ByteBuffer.allocate(X);
}
【问题讨论】:
-
不,没有。
标签: java garbage-collection out-of-memory heap-memory