是否有人试图将java对象移出堆?我尝试通过使用不安全的库来序列化、反序列化和存储字节数组。但是包含多个对象的复杂对象使得这是一个乏味的过程。有更好的解决方案吗?
有一些库可以使这个过程至少不那么麻烦,最多可以更有效地存储和从堆外内存访问更多对象。我首先想到的是编年史价值观和Slab,但我记得还有更多。
不安全字段是不安全的实例。如果您不知道如何获取,只需使用:
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