2012-04-02 101 views
4

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

有些人指出了像Jmalloc/EHcache这样的框架。其实我更想明白,他们是怎么做到的。

我很好,有一些直接的方法甚至是一些间接的方法(例如,首先序列化Java对象)。

+2

你为什么想这样做?只是好奇。 – 2012-04-02 14:47:03

+0

[Unsafe](http://www.docjar.com/docs/api/sun/misc/Unsafe.html)类可能会帮助你做出奇怪的事情... – assylias 2012-04-02 14:47:42

+0

另请参阅:http://stackoverflow.com/questions/5574241 /有趣的太阳 - 不安全的使用 – assylias 2012-04-02 14:48:33

回答

5

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

2

如果您的意思是Java对象,那么不是,这对于标准虚拟机是不可能的。虽然你可以随时修改虚拟机,如果你想实验(例如Jikes RVM就是为了这个目的而做的),但要记住,结果不会真的成为Java。

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

+0

你能否给我提供关于非java数据结构分配的更多细节。我很好将我的对象转换为序列化/字节缓冲区形式。一些Java解决方案会为此工作吗? – ManojGumber 2012-04-02 14:56:51

+0

@ManojGumber另外两个答案包含这方面的提示:使用直接的ByteBuffers是一种方法,或者您可以使用像jmalloc或BigMemory这样的高级库。但是,如果GC是您的主要瓶颈,您应该只在生产中使用它。 – biziclop 2012-04-02 15:06:16

3

您可以使用离堆内存方法 查找例如jmalloc

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

+0

我更想了解的是,像jmalloc和EHCache这样的框架是如何做到的。 – ManojGumber 2012-04-02 15:01:15

+0

@MonojGumber:它们的底层机制很可能不是用Java编写的,而是用本机代码编写的。该库然后提供一个Java接口。 – 2012-04-02 15:10:00

+0

它可以在他们使用序列化的jmalloc项目页面上读取。这是存储大型对象的好主意,但不适合性能。 – Neet 2012-04-02 15:32:55

3

我有做这样的事情一个图书馆。您可以创建可用于可重写对象或排队事件的摘录。它会跟踪对象开始和结束的位置。缺点是,图书馆认为你会每天或每周循环一次所有对象。即没有这样清理。另一方面,它的效率非常高,可以以事件驱动的方式使用,持续存在并可以在流程之间共享。您只能使用几MB的堆就可以拥有数百GB的数据。

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

BTW:它支持的ByteBuffers或更高的性能,使用不安全。

+0

它看起来很有趣....我会通过这个API – ManojGumber 2012-04-02 16:33:31

+0

即使你不使用它,它可能会给你一些想法。 – 2012-04-02 19:17:00

相关问题