栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

无论内存需求多大,有没有办法强制JVM使用swap?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

无论内存需求多大,有没有办法强制JVM使用swap?

显然,有一种方法可以绕过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
哈希映射和
key
s将在堆中,但这不会占用太多内存。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/438599.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号