显然,有一种方法可以绕过Java堆的限制。它甚至用在名为BigMemory的商业产品中,该产品基本上可以通过透明地换成OS交换和/或磁盘(如果需要)来拥有几乎无限的内存。
这个想法是使用direct
ByteBuffer来存储对象数据。因为直接字节缓冲区的内容存储在本机进程内存(而不是堆)中,所以您可以依靠OS交换机制为您交换内存。我在这个网站上找到了这个(在页面上搜索“ direct byte buffer”)。
这是实现它的方法(java-pseudo-pre’ish):
class NativeMemoryCache{ private Map<Object, ByteBuffer> data = new HashMap<...>(); public void put(Object key, Serializable object){ byte[] bytes = serialize(object); //allocate native memory to store our object ByteBuffer buf = ByteBuffer.allocateDirect(bytes.length); buf.put(bytes); buf.flip(); data.put(key, buf); } public Object get(Object key){ ByteBuffer buf = data.get(key).duplicate(); byte[] bytes = new byte[buf.remaining()]; buf.get(bytes); return deserialize(bytes); } private byte[] serialize(Object obj){ ... } private Object deserialize(byte[] bytes){ ... }}希望你明白。您只需要实现序列化(您也可以使用zip压缩对象。如果您没有几个大对象,尤其是那些包含可压缩数据(例如字符串)的大对象,这将非常有效)。
当然,
NativeMemoryCache对象,
data哈希映射和
keys将在堆中,但这不会占用太多内存。



