java - 我们可以自己做内存管理吗?

时间:2012-04-02 14:43:01

标签: java memory-management garbage-collection jvm

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

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

我可以使用一些直接方法甚至是一些间接方法(例如,首先序列化java对象)。

4 个答案:

答案 0 :(得分:5)

您无法在外部存储器位置分配Java对象,但您可以映射内存,例如,在本机库中分配到直接ByteBuffer以从Java代码中使用它。

答案 1 :(得分:3)

您可以使用 off the heap 内存方法 查看示例jmalloc

这也是有用的链接Difference between on and off the heap

答案 2 :(得分:3)

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

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

BTW:它支持ByteBuffers或使用Unsafe来提高性能。

答案 3 :(得分:2)

如果您的意思是Java对象,那么不,这对标准虚拟机来说是不可能的。虽然如果你想进行实验,你可以随时修改VM(例如Jikes RVM是为了这个目的而制作的),但请记住,结果不再是Java了。

对于非java数据结构的内存分配,这是可能的,并且正在由本地库定期完成,甚至还有一些Java支持(在其他答案中提到),一般警告你可以非常很容易自毁。