在一个mapreduce程序中,我使用 new Text() 在context.write期间。
new Text()
context.write(key, new Text(outputRecord.toDelimitedString("|")));
在使用上述语句时,我想知道如何存储文本对象以及如何处理内存管理。还想知道一个对象存在一个值后不被任何对象引用。请告诉我这件事。
fjnneemd1#
不 Text 在hadoop中不是一成不变的。这不可能,因为hadoop的序列化过程隐含地禁止了不变性。在这种情况下, context.write 只会序列化 Text 直接在调用中放入字节缓冲区,因此 Text 对象将在方法返回后很快被丢弃。请记住,仍然有一个堆栈引用指向 Text 对象,因此它将不符合垃圾收集的条件。
Text
context.write
uajslkp62#
如果您检查了hadoop文本源代码,您的所有问题都将得到回答。此类使用标准utf8编码存储文本。它提供了在字节级序列化、反序列化和比较文本的方法。长度类型为整数,并使用零压缩格式序列化。此外,它还提供了字符串遍历方法,而无需将字节数组转换为字符串。还包括用于序列化/反序列化字符串、编码/解码字符串、检查字节数组是否包含有效的utf8代码、计算编码字符串长度的实用程序。从源代码中可以看出,类不是不可变的。关于你的问题:还想知道一个对象存在一个值后不被任何对象引用您需要了解jvm内存模型。
2条答案
按热度按时间fjnneemd1#
不
Text
在hadoop中不是一成不变的。这不可能,因为hadoop的序列化过程隐含地禁止了不变性。在这种情况下,
context.write
只会序列化Text
直接在调用中放入字节缓冲区,因此Text
对象将在方法返回后很快被丢弃。请记住,仍然有一个堆栈引用指向
Text
对象,因此它将不符合垃圾收集的条件。uajslkp62#
如果您检查了hadoop文本源代码,您的所有问题都将得到回答。
此类使用标准utf8编码存储文本。它提供了在字节级序列化、反序列化和比较文本的方法。长度类型为整数,并使用零压缩格式序列化。
此外,它还提供了字符串遍历方法,而无需将字节数组转换为字符串。
还包括用于序列化/反序列化字符串、编码/解码字符串、检查字节数组是否包含有效的utf8代码、计算编码字符串长度的实用程序。
从源代码中可以看出,类不是不可变的。
关于你的问题:
还想知道一个对象存在一个值后不被任何对象引用
您需要了解jvm内存模型。