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

How to debug memory usage climbing in PhoneGap app?

本文关键字:内存 使用率 调试 PhoneGap 应用程序      更新时间:2023-09-26

我有一个PhoneGap/JQuery MObile应用程序,它通过Ajax从服务器获取数据并将其显示为列表。每次Ajax获取时,应用程序占用的内存将增加约10MB。对于第一次提取,它可能还可以,因为它提取了大量记录(大约700条)。然而,对于随后的调用,我的理解是它应该重用内存,而不是每次再堆积10MB。我使用.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>

这是从服务器获取数据并显示在上述分区中的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("刷新")中似乎存在某种内存泄漏。

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

如果你必须在Phonegap内部运行,但有一个Android设备,也可以将Chrome调试器连接到它,通过一些黑客攻击,也可以连接iOS设备和/或模拟器。

内疚不是你的代码。喜欢消耗内存的是jQuery。在内存消耗中,我经常看到纯javascript和jQuery应用程序之间的比例为4。

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

BR

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

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