在Android上检测java内存泄漏

在Android上检测java内存泄漏,java,android,websocket,heap-memory,Java,Android,Websocket,Heap Memory,我正在尝试用android运行websocket服务器。它在windows中运行得很好,但在android中却出现了堆溢出。原因可能是什么? logcat中的消息是 07-15 03:29:09.608: D/dalvikvm(2169): GC_CONCURRENT freed 427K, 9% free 6898K/7559K, paused 13ms+6ms 07-15 03:29:10.668: D/dalvikvm(2169): GC_CONCURRENT freed 418K, 9%

我正在尝试用android运行websocket服务器。它在windows中运行得很好,但在android中却出现了堆溢出。原因可能是什么? logcat中的消息是

07-15 03:29:09.608: D/dalvikvm(2169): GC_CONCURRENT freed 427K, 9% free 6898K/7559K, paused 13ms+6ms
07-15 03:29:10.668: D/dalvikvm(2169): GC_CONCURRENT freed 418K, 9% free 6898K/7559K, paused 13ms+5ms
07-15 03:29:11.760: D/dalvikvm(2169): GC_CONCURRENT freed 418K, 9% free 6898K/7559K, paused 13ms+12ms
07-15 03:29:12.758: D/dalvikvm(2169): GC_CONCURRENT freed 416K, 9% free 6901K/7559K, paused 8ms+8ms

“它在windows中运行得很好,但在android中却出现了堆溢出。”因为这两种设备的内存限制不同


当内存即将用完时,GC会经常释放内存。日志是正常的,因为您的手机的代码内存比您的电脑的内存小。

GC启动以释放内存这是GC启动以释放内存时看到的暂停时间。13ms+6ms。。查看此视频,您将知道原因。当堆已满且应用程序需要内存时,gc启动以释放内存。gc日志并不意味着您的应用程序存在内存泄漏。这意味着您已经分配和释放了GC现在已清理的内存。如果它是一个漏洞,你的应用程序仍然会有一些不需要的内存引用,最终,你的应用程序会崩溃,出现内存不足的异常。但从日志本身看,你无法判断这一点。当然,如果你的应用程序正在达到堆阈值,gc将更积极地启动,以防止你的应用程序崩溃。如果我增加我正在使用的仿真器的内存(RAM和VM堆),会有帮助吗?要查找内存泄漏,你可以在固定时间段从ddms触发gc,并使用MAT(内存分析器工具)分析gc转储. 如果您不知道/不想学习使用MAT,您可以尝试使用另一种工具:直观地查看应用程序的内存增长。如果您看到应用程序的内存消耗大部分时间接近最大堆限制,只有这样,您才需要增加堆大小。免责声明:我与littleeye有关联