Java,缓冲区延迟分配,按需可释放并作为byte []寻址

时间:2013-12-15 15:34:30

标签: java memory-management

我试图通过扩展现有的Java程序来实现概念验证内存感知调度功能。该程序使用byte []形式的缓冲区。出于我的目的byte []是有问题的,因为

  1. 他们是垃圾收集
  2. 它们被预先分配而不是懒惰(JVM似乎触及它在创建缓冲区时分配的所有页面)
  3. 他们让JVM分配越来越多的内存,而这些内存并没有给回操作系统。
  4. 为了实现我的目标,我希望缓冲区是懒惰分配的内存(仅在写入时分配的页面)并且可以按需释放。这与C ++中的情况类似。 此外,我希望尽可能减少对现有代码库的更改。

    我查看了nio.ByteBuffer和不安全的课程。不适合我的情况,因为

    1. java.nio.ByteBuffers似乎没有被懒惰分配。当我分配一个空的1GB缓冲区时,程序的RSS立即变为1GB。
    2. Unsafe.allocateMemory已懒惰分配,但我不知道如何将其引用为byte []
    3. 有什么方法可以解决这个问题吗? 有什么方法可以将Unsafe.allocateMemory()分配的内存视为byte []? 或者将现有byte []更改为指向分配给不安全的内存?

      谢谢

1 个答案:

答案 0 :(得分:0)

Java旨在具有单独的内存区域。

    堆上的
  • 像byte [],它被设计为可重新分配并且是零并且不是懒惰的。这样做的原因是管理内存。
  • off heap,它具有可以延迟的优点,但它不能伪装成像byte []这样的托管数据类型。