3

在其中一个 mapreduce 程序中,我new Text()在 context.write 期间使用。

context.write(key, new Text(outputRecord.toDelimitedString("|")));

当我使用上述语句时,我想知道如何存储 Text 对象以及如何处理内存管理。还想知道在没有被任何对象引用之后对象值的存在。

请让我知道这件事。

4

2 回答 2

1

Hadoop 中的NoText不是一成不变的。不可能,因为 Hadoop 的序列化过程隐含地禁止了不变性。

在这种特殊情况下,context.write将直接在调用内部将 的内容序列化Text到字节缓冲区中,因此该Text对象将在方法返回后很快被丢弃。

请记住,当Text对象被传递到方法中时,仍然存在对对象的堆栈引用,因此它不符合垃圾回收的条件。

于 2014-03-21T15:13:04.630 回答
0

如果您检查了Hadoop Text源代码,您的所有问题都会得到解答。

此类使用标准 UTF8 编码存储文本。它提供了在字节级别序列化、反序列化和比较文本的方法。长度的类型是整数,并使用零压缩格式进行序列化。

此外,它提供了字符串遍历的方法,无需将字节数组转换为字符串。

还包括用于序列化/反序列化字符串、编码/解码字符串、检查字节数组是否包含有效 UTF8 代码、计算编码字符串长度的实用程序。

正如您从源代码中看到的那样,该类不是不可变的。

关于你的问题:

还想知道在没有被任何对象引用后对象值的存在

您需要阅读有关 JVM 内存模型的信息。

于 2014-03-21T11:19:40.927 回答