当前位置: 首页 > 知识库问答 >
问题:

将对象移出堆

韩梓
2023-03-14

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

共有2个答案

养翔
2023-03-14

有一些库可以使这个过程至少不那么麻烦,最多可以更有效地存储和从堆外内存访问更多对象。我首先想到的是编年史价值观和Slab,但我记得还有更多。

巩才捷
2023-03-14

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

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;
}

请记住,这应该适用于热点JVM,因为字段名称在不同的实现中有所不同。

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

1)为内存地址分配适当的字节。您可以读取偏移量4L处的int,转换为无符号long,并添加12L,并在该位置获取地址。

示例实现:

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;
}

您可以使用以下方式分配离堆空间:

Object object = // Your object
long size = sizeOf(object);
long address = unsafe.allocateMemory(size);

(将地址字段放在手边)

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

示例:

getUnsafe().copyMemory(
            object,
            0,
            null,
            address,
            size);

完成!现在您的对象已脱离堆。

要取回您的对象,只需执行以下操作:

// Class wide field
Object anchor;

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

unsafe.putLong(this, offset, address);

那么,锚点应该是来自堆外的对象!

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

unsafe.freeMemory(address);

(看,告诉你地址很重要[好像还不明显])

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

 类似资料:
  • 预期输出JSON: 提前致谢

  • 问题内容: 我正在使用Google GSON将Java对象转换为JSON。 目前,我具有以下结构: 当前,对象在对象内部。我想跳过对象并将对象移动到对象,如下所示: 如何使用GSON做到这一点? 编辑:我试图使用TypeAdapter来修改Step.class,但是在写入方法中,我无法将我的工时对象添加到JsonWriter中。 问题答案: 您可以通过编写代码,然后为注册一个自定义的序列化器,并确

  • 移动对象 可以通过以下方式移动对象:使用特定工具拖动对象、使用键盘上的箭头键,或在面板或对话框中输入精确数值。 在移动对象时,您可以使用对齐功能来帮助定位对象。例如,您可以使指针对齐参考线和锚点,也可以使对象边界对齐网格线。还可以使用 “对齐 ”面板,根据对象之间的相对位置来对其进行定位。 然后,您便可以使用 Shift 键来限制一个或多个对象的移动,使其沿相对当前 x 轴和 y 轴的精确水平、垂

  • 我在Jolt转换中有一个JSON对象数组的数组,但我需要将对象向上移动到顶层数组。我尝试添加另一个Shift,但这只是将对象移到相同的位置,或者将两个子对象的值放入一个值数组中。

  • 我需要将一个通用的PdfObject添加到一个PDF中,而不需要将它放在文档的任何地方。 下面是iText 5中的代码: 下面是我在iText 7中尝试做的事情(没有addPdfObject方法): 但是,在我关闭数组后,它不在PDF中。我记得Bruno在某处提到过iText 7现在删除close上未使用的对象,类似于iText 5中的pdfreader.removeUnusedObjects()

  • 问题内容: 我需要转换从REST API获得的JSON数据,并将其转换为CSV以便进行分析。问题在于JSON数据不一定遵循相同的内容,因此我无法定义映射类型。这已经成为一项挑战,占用了我太多时间。我已经创建了一些代码,但是由于它在此行上引发了异常,因此它当然不起作用 错误是: 附加信息:无法将当前JSON对象(例如{“ name”:“ value”})反序列化为类型’System.Collecti