如何在 PhoneGap 应用程序中调试内存使用攀升?

Posted

技术标签:

【中文标题】如何在 PhoneGap 应用程序中调试内存使用攀升?【英文标题】:How to debug memory usage climbing in PhoneGap app? 【发布时间】:2014-11-08 00:58:52 【问题描述】:

我有一个 PhoneGap / JQuery 移动应用程序,它通过 Ajax 从服务器获取数据并将其显示为列表。随着每次 Ajax 获取,App 占用的内存会增加大约 10 MB。对于第一次获取它可能没问题,因为它获取大量记录(大约 700 条)。但是,对于后续调用,我的理解是它应该重用内存,而不是每次再堆积 10 MB。我使用 .off() 来释放事件处理程序,以防它们持有内存但没有成功。

这是显示输出的主页Div:

<div data-role="content"  class="MainContent"  style="overflow:hidden; padding-top: 0px;">
    <ul data-divider-theme="b" data-role="listview" data-inset="true" class="MainMenu">

    </ul>

这是从服务器获取数据并显示在上述 div 中的 javascript 代码。

AjaxFile = "mydomai.com/ajax.php";
$.get(AjaxFile, function (AjaxData) 

    $( ".PL" ).off();
    $(".MainMenu").off();
    $(".MainContent").off();

    AjaxData = '<li class="MainMenuList" data-role=list-divider>' + gTitle + AjaxData;
    $(".MainMenu").empty();
    $(".MainMenu").html(AjaxData);
    $(".MainMenu").listview('refresh');
    window.scrollTo(0, 0);
    $.mobile.loading('hide');

    HighlightRow(gCurrentFile);
    $(document).ready(function () 
        $(".PL").click(function () 
            if ( !$(this).hasClass("BTitleRow") )
            
                $(".PL").removeClass("RowHighlight");
                $(this).addClass("RowHighlight");
                OpenNewLink($(this).attr('name'));
            
        );
    );

);

AjaxData = null;
return;

如何释放内存并确保相同的内存被重复使用,而不是堆积越来越多的内存?

更新

即使我删除了下面的部分,我仍然可以看到内存使用量在攀升:

$(document).ready(function () 
        $(".PL").click(function () 
            if ( !$(this).hasClass("BTitleRow") )
            
                $(".PL").removeClass("RowHighlight");
                $(this).addClass("RowHighlight");
                OpenNewLink($(this).attr('name'));
            
        );
    );

Ajax 和 listview("refresh") 中似乎存在某种内存泄漏。

【问题讨论】:

你的列表有很多图片吗? 否,列表不包含任何图标。 尝试在 jQuery.ajax( ) 中添加“cache: false”。顺便说一句,您如何计算/知道它使用大约 10 MB 内存? Bcoz 对我来说是新的,我想知道,谢谢 长按主屏幕并单击“活动应用程序”选项卡,该选项卡也会显示内存使用情况。 刷新页面。这是一种方式 【参考方案1】:

不是一个完整的答案,但如果您可以在 Chrome 中运行 web 应用程序(因此在 Phonegap 之外),您可以使用 Javascript 分析器获取堆快照来确定内存的使用位置。

如果您必须在 Phonegap 中运行但拥有 android 设备,也可以将 Chrome 调试器连接到它,并且通过一些黑客攻击也可以连接 ios 设备和/或模拟器。

【讨论】:

谢谢。是的,我可以运行 Ripple Emulate 在浏览器中运行它。你在说这个吗:developer.mozilla.org/en-US/docs/Tools/Profiler 不,我的意思是堆分析,请参见此处:developer.chrome.com/devtools/docs/heap-profiling【参考方案2】:

内疚不是你的代码。爱吃内存的是 jQuery 我经常看到纯 javascript 和 jQuery 应用程序在内存消耗方面的比率为 4。

要么你不使用 jQuery 作为你移动开发的关键部分,要么你不再将 jQuery 用于你的移动应用程序(这就是我正在做的),要么你使用 http://plugins.jquery.com/cache/ 并随时清理内存到时间。

BR

【讨论】:

谢谢。将尝试插件。【参考方案3】:

试试这个,它会在您的应用启动时清除捕获。我知道这是你现在真正想要的,但它可能会对你有所帮助..

super.clearCache(); // just add This Line
super.loadUrl("file:///android_asset/www/index.html");

【讨论】:

这是Java的东西;不是吗?而且我没有使用Java。它使用 JQuery Mobile 的纯 JavaScript。 @Anjum 是的,您只需将它添加到您在 Eclipse 的 src 文件夹中找到的 Activity 的 java 文件中。 (在我的情况下 src -> com.app.example -> MainActivity.java)你提到你使用 phonegap,所以如果你在 Eclipse 中创建 phonegap 应用程序,你会在 src 文件夹中找到它 不,我没有使用 Eclipse。我正在使用简单的文本编辑器(Notepad++)来维护源代码。

以上是关于如何在 PhoneGap 应用程序中调试内存使用攀升?的主要内容,如果未能解决你的问题,请参考以下文章

使用phonegap在android模拟器中调试javascript

Phonegap - 在 xcode 中配置调试和发布版本

在 iOS 上调试 Cordova (PhoneGap) 代码

Phonegap 应用程序文本出现,然后立即消失。我该如何调试?

在设备上调试 PhoneGap

Visual Studio 2012 中的 Phonegap:如何使用 console.log?