我正在做一项学校工作来分析hadoop中堆的使用。它涉及运行两个版本的mapreduce程序来计算论坛评论长度的中位数:第一个是“记忆 - 无意识”,而减少程序在内存中处理每个评论长度的列表;第二个是'记忆意识',而reducer使用一个非常节省内存的数据结构来处理数据。
目的是使用这两个程序来处理不同大小的数据,并观察第一个内存使用率如何更快地上升(直到它最终耗尽内存)。
我的问题是:如何获取hadoop或reduce任务的堆使用情况?
我的计数器“Total committed heap usage(bytes)”会包含这些数据,但我发现程序的两个版本都返回几乎相同的值。
关于程序的正确性,“记忆 - 无意识”一个用尽大量输入的内存耗尽而失败,而另一个则没有并且能够完成。
提前致谢
答案 0 :(得分:1)
我不知道你正在使用哪种具有内存意识的数据结构(如果给出哪一个可能有帮助),但是大多数内存数据结构利用虚拟内存意味着数据结构大小在某种程度上增加了策略额外数据元素将被转储到虚拟内存中。因此,我们不会导致内存不足错误。但如果记忆无意识不这样做。在这两种情况下,数据结构大小将保持不变,这就是您获得相同大小的原因。要获得Reducer的实际内存使用量,您可以通过以下方式获取:
新功能添加了java 1.5是Instrumentation
接口,您可以通过该接口获取对象内存使用情况(getObjectSize
)。关于它的好文章:LINK
/* Returns the amount of free memory in the Java Virtual Machine. Calling the gc method may result in increasing the value returned by freeMemory.*/
long freeMemory = Runtime.getRuntime().freeMemory()
/* Returns the maximum amount of memory that the Java virtual machine will attempt to use. If there is no inherent limit then the value Long.MAX_VALUE will be returned. */
long maximumMemory = Runtime.getRuntime().maxMemory();
/* Returns the total amount of memory in the Java virtual machine. The value returned by this method may vary over time, depending on the host environment.
Note that the amount of memory required to hold an object of any given type may be implementation-dependent. */
long totalMemory = Runtime.getRuntime().totalMemory()