我们可以自己管理内存吗



是否可以自己执行内存管理。例如,我们在堆空间之外分配一块内存,这样它就不会受到GC的影响。我们自己负责从这段内存中分配/释放对象。

有些人指出了像Jmalloc/EHcache这样的框架。事实上,我更想了解他们是如何做到的。

我对一些直接的方法,甚至是一些间接的方法都很满意(例如,首先序列化java对象)。

您不能在外部内存位置分配Java对象,但您可以将本地库中分配的内存映射到直接的ByteBuffer中,以便从Java代码中使用它。

您可以使用堆外内存方法例如jmalloc

这也是有用的链接堆内和堆外之间的差异

我有一个库可以做这类事情。您可以创建可重写对象或排队事件使用的摘录。它跟踪对象的起点和终点。缺点是库假设您将每天或每周循环一次所有对象。即不存在这样的清理。从好的方面来说,它非常高效,可以以事件驱动的方式使用,持久化,并且可以在进程之间共享。您可以拥有数百GB的数据,而只使用几MB的堆。

https://github.com/peter-lawrey/Java-Chronicle

BTW:它支持ByteBuffers或使用Unsafe来获得额外的性能。

如果你指的是Java对象,那么不,这在标准VM中是不可能的。尽管如果你想进行实验,你总是可以修改VM(例如Jikes RVM就是为了这个目的而制作的),但请记住,结果将不再是Java。

至于非java数据结构的内存分配,这是可能的,并且由本机库定期进行,甚至还有一些java对它的支持(在其他答案中提到),但需要注意的是,使用它可以很容易地自毁。

最新更新