首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将对象移出堆

将对象移出堆
EN

Stack Overflow用户
提问于 2014-08-12 14:17:31
回答 2查看 7.3K关注 0票数 11

是否有人尝试将java对象从堆中移出?我尝试使用不安全的库来序列化、反序列化和存储字节数组。但是包含多个对象的复杂对象使这一过程变得单调乏味。有更好的解决方案吗?

EN

回答 2

Stack Overflow用户

发布于 2014-08-12 14:51:54

Unsafe字段是unsafe的实例。如果您不知道如何获取它,只需使用:

代码语言:javascript
复制
Unsafe unsafe = getUnsafe();
Unsafe getUnsafe() {
    try {
        Field f = Unsafe.class.getDeclaredField("theUnsafe");
        f.setAccessible(true);
        return (Unsafe) f.get(null);
    } catch (Exception x) {
        x.printStackTrace();
    }

    return null;
}

请记住,这应该适用于HotSpot JVM,因为字段名在不同的实现中是不同的。

您可以通过以下方式将对象移出堆:

1)将适当的字节分配给存储器地址。您可以读取偏移量为4L的int,将其转换为unsigned long,然后添加12L,得到该位置的地址。

一个示例实现:

代码语言:javascript
复制
public static long sizeOf(Object object) {
    return unsafe.getAddress( normalize( unsafe.getInt(object, 4L) ) + 12L );
}

public static long normalize(int value) {
   if(value >= 0) return value;
   return (~0L >>> 32) & value;
}

您可以使用以下命令来分配外堆空间:

代码语言:javascript
复制
Object object = // Your object
long size = sizeOf(object);
long address = unsafe.allocateMemory(size);

(请将地址字段放在手边)

2)将对象复制到地址指定的内存段。

示例:

代码语言:javascript
复制
getUnsafe().copyMemory(
            object,
            0,
            null,
            address,
            size);

完成了!现在你的对象是离堆的。

要取回您的对象,只需执行以下命令:

代码语言:javascript
复制
// Class wide field
Object anchor;

// Deserializarion
long offset = unsafe.objectFieldOffset(this.getClass().getDeclaredField("anchor"));

unsafe.putLong(this, offset, address);

然后,锚点应该是你在offheap中的对象!

注意:执行完以下操作后,请记住释放已分配内存的资源:

代码语言:javascript
复制
unsafe.freeMemory(address);

(看,我告诉过你地址很重要,就好像它还不明显一样)

来源:http://highlyscalable.wordpress.com/2012/02/02/direct-memory-access-in-java/,一个叫RawCode的很棒的人,我不相信他在这里,但是不久前告诉了我关于不安全的工作原理。

票数 18
EN

Stack Overflow用户

发布于 2016-07-10 16:53:42

有一些库使得这个过程至少不那么麻烦,最多存储更多的对象到堆外内存或从堆外内存更有效地存储对象。我首先想到的是Chronicle ValuesSlab,但我记得还有更多。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25257400

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档