是否可以自己执行内存管理。例如我们在堆空间之外分配一块内存,这样它就不受GC的影响。我们自己负责从这块内存中分配/释放对象。
有些人指出像Jmalloc / EHcache这样的框架。实际上我更想了解他们实际上是如何做到的。
我可以使用一些直接方法甚至是一些间接方法(例如,首先序列化java对象)。
答案 0 :(得分:5)
您无法在外部存储器位置分配Java对象,但您可以映射内存,例如,在本机库中分配到直接ByteBuffer
以从Java代码中使用它。
答案 1 :(得分:3)
您可以使用 off the heap 内存方法 查看示例jmalloc
答案 2 :(得分:3)
我有一个可以做这种事情的库。您可以创建可用于可重写对象或排队事件的摘录。它跟踪对象的起点和终点。缺点是库假设您将每天或每周循环一次所有对象。即没有清理。从好的方面来说,它非常有效,可以以事件驱动的方式使用,持久化并可以在进程之间共享。只使用几MB的堆就可以拥有数百GB的数据。
https://github.com/peter-lawrey/Java-Chronicle
BTW:它支持ByteBuffers或使用Unsafe来提高性能。
答案 3 :(得分:2)
如果您的意思是Java对象,那么不,这对标准虚拟机来说是不可能的。虽然如果你想进行实验,你可以随时修改VM(例如Jikes RVM是为了这个目的而制作的),但请记住,结果不再是Java了。
对于非java数据结构的内存分配,这是可能的,并且正在由本地库定期完成,甚至还有一些Java支持(在其他答案中提到),一般警告你可以非常很容易自毁。