当前位置: 首页 > 知识库问答 >
问题:

Java,缓冲区延迟分配,可按需释放,以字节[]寻址

晏正豪
2023-03-14

我试图通过扩展现有的Java程序来实现概念验证的内存感知调度功能。程序使用字节[]形式的缓冲区。就我而言,字节[]有问题,因为

  1. 他们是垃圾回收
  2. 它们是预先分配的,而不是懒惰地分配的(JVM在创建缓冲区时似乎会触及它分配的所有页面)
  3. 它们使JVM分配越来越多的内存,而这些内存并没有还给操作系统。

为了实现我的目标,我希望缓冲区能够被延迟分配内存(只有在写入时才分配页面),并且可以按需释放。这与C中的情况类似。此外,我希望尽可能减少对现有代码库的更改。

我看了nio。ByteBuffer和不安全类。两者都不适合我的情况,因为

  1. <代码>java。nio。ByteBuffers似乎没有被懒散地分配。当我分配一个空的1GB缓冲区时,程序的RSS立即变为1GB

有什么办法解决这个问题吗?查看分配给的内存的任何方式都不安全。allocateMemory()作为字节[]?或者将现有的字节[]更改为指向分配了不安全的内存?

非常感谢。

共有1个答案

丌官星渊
2023-03-14

Java被设计成具有独立的内存区域。

  • 在类堆字节[]上,该字节被设计为可重新分配的,为零且不懒惰。这样做的原因是内存被管理
  • 堆外数据类型的优点是它可以是懒惰的,但它不能假装是像byte[]这样的托管数据类型
 类似资料:
  • 有没有一种方法可以在请求处理程序中获得反应堆网络中使用的字节缓冲区分配器?类似于如何在纯Netty中执行?

  • 我试图理解DirectByteBuffer如何在Linux上工作,并编写了以下在strace下运行的非常简单的程序: 实际上,我期望一些mmap或sys\u brk系统调用直接从操作系统分配内存,但实际上它只是设置请求页面的读写保护。我的意思是: 这似乎是分配直接缓冲区比分配堆缓冲区慢的原因,因为每次分配都需要系统调用。 如果我错了,请纠正我,但是堆缓冲区分配(如果发生在TLAB内部)相当于返回一

  • 我在扩展ReplayingDecoder的DecodeEventHandler类中遇到ResourceAkDetector异常。我很难理解何时何地应该释放任何方法的bytbuf。我需要释放传递的字节Buf吗?我尝试释放header、eventBody和attachedData ByteBuf对象,但这在稍后的代码中产生了问题。密码是... 附加信息 当我释放由调用ByteBuf.readBytes

  • 在我们的一个java应用程序中,我们有很多协议缓冲区类,jar本质上公开了一个接口和另一个应用程序使用的一种方法。我们注意到第一次调用这个方法的调用时间相当高( 这一点在另一个应用程序中得到进一步证实,该应用程序的工作方式完全不同,但也使用协议缓冲区,表现出相同的行为。此外,我们还尝试创建一个虚拟实例()以及我们添加的每个proto buffer类,我们都可以注意到第一次调用丢弃的开销。 在里面N

  • 问题内容: 由于它不在jvm heap&gc中,何时发布?还是一直保留到流程终止? 但是所有答案都是模糊的,没有一个明确的答案,是否有明确的答案?至少适用于 64位Linux 上的 Java 8 。 __ 问题答案: 不使用旧的Java终结器。相反,它使用内部API。它创建一个新线程并存储到每个创建的线程中(除了重复和切片指的是主缓冲区)。当变成 幻影可到达的 (也就是说,不再存在对字节缓冲区的强

  • 我目前正在处理一些小的endian二进制数据,我已经到了一个尴尬的地步,需要将奇数字节转换成整数值。 现在使用类,我能够很好地使用函数读取int和long,它们分别读取4和8个字节。 然而,在本例中,我需要读取三个字节,并将它们转换为int。我尝试过使用(2字节1字节),但我认为这不是正确的方法。 我猜我需要对字节进行位移位才能得到正确的int值,但我总是对位移位感到困惑。 此外,我还以为字节缓冲