在其中一个 mapreduce 程序中,我new Text()
在 context.write 期间使用。
context.write(key, new Text(outputRecord.toDelimitedString("|")));
当我使用上述语句时,我想知道如何存储 Text 对象以及如何处理内存管理。还想知道在没有被任何对象引用之后对象值的存在。
请让我知道这件事。
Hadoop 中的NoText
不是一成不变的。不可能,因为 Hadoop 的序列化过程隐含地禁止了不变性。
在这种特殊情况下,context.write
将直接在调用内部将 的内容序列化Text
到字节缓冲区中,因此该Text
对象将在方法返回后很快被丢弃。
请记住,当Text
对象被传递到方法中时,仍然存在对对象的堆栈引用,因此它不符合垃圾回收的条件。
如果您检查了Hadoop Text源代码,您的所有问题都会得到解答。
此类使用标准 UTF8 编码存储文本。它提供了在字节级别序列化、反序列化和比较文本的方法。长度的类型是整数,并使用零压缩格式进行序列化。
此外,它提供了字符串遍历的方法,无需将字节数组转换为字符串。
还包括用于序列化/反序列化字符串、编码/解码字符串、检查字节数组是否包含有效 UTF8 代码、计算编码字符串长度的实用程序。
正如您从源代码中看到的那样,该类不是不可变的。
关于你的问题:
还想知道在没有被任何对象引用后对象值的存在
您需要阅读有关 JVM 内存模型的信息。