内存泄漏LibGDX ANdroid

时间:2014-12-30 07:50:28

标签: android memory-leaks libgdx

我正在制作一个带有libgdx的动态壁纸应用程序,我根据时间更改资产。对于。例如从早上6点到下午6点,我有“早晨图形”,之后我从下午6点到早上6点有“晚间图形”。

我构建资产的方式如下

我有12个静态数组类型AtlasRegion 1静态纹理区域变量和1个静态纹理变量。

我有两个静态函数loadMorning()和loadEvening()来加载资源。

在功能中我加载如下

对于所有数组,如果它们不为null,则执行array.clear() 然后加载区域。在重置它们的值之前,处理TextureRegion变量并将纹理变量设置为null。

正在发生的事情是,每次资产变更后,记忆似乎都会增加 作为一个用户,我正在使用这个应用程序来查看内存

https://play.google.com/store/apps/details?id=mem.usage&hl=en

当我第一次启动我的应用时......它在应用中显示为68MB,

Day1 Morning Stats

第1天

ID      Heap Size       Allocated       Free            %Used    #Objects
1       10.812 MB       3.186 MB        7.626 MB        29.47%    45,405    



                   Pss  Private  Private  Swapped     Heap     Heap     Heap
                 Total    Dirty    Clean    Dirty     Size    Alloc     Free
                ------   ------   ------   ------   ------   ------   ------
  Native Heap        0        0        0        0    16620     4285       38
  Dalvik Heap     8692     8604        0        0    11072     3293     7779
 Dalvik Other     1374     1216        0        0
        Stack       96       96        0        0
    Other dev    33016     4908        4        0
     .so mmap     1266      692      136        0
    .apk mmap      160        0      116        0
    .dex mmap      287       20        8        0
   Other mmap        5        4        0        0
      Unknown     1431     1412        0        0
        TOTAL    46327    16952      264        0    27692     7578     7817

 Objects
               Views:        1         ViewRootImpl:        0
         AppContexts:        3           Activities:        0
              Assets:        2        AssetManagers:        2
       Local Binders:       11        Proxy Binders:       19
    Death Recipients:        0
     OpenSSL Sockets:        0

 SQL
         MEMORY_USED:        0
  PAGECACHE_OVERFLOW:        0          MALLOC_SIZE:        0

第1天晚间统计

加载晚间资产后的

adb日志

D / dalvikvm(2451):GC_FOR_ALLOC释放1619K,71%免费3281K / 11072K,暂停14ms,总计15ms

D / dalvikvm(2451):GC_FOR_ALLOC释放1517K,71%免费3281K / 11072K,暂停11ms,总计11ms

I / dalvikvm-heap(2451):将堆(frag case)增长到6.548MB以进行1331595字节分配

D / dalvikvm(2451):GC_CONCURRENT释放1862K,67%免费4127K / 12376K,暂停2ms + 2ms,总计13ms

D / dalvikvm(2451):GC_EXPLICIT释放2384K,74%免费3268K / 12376K,暂停2ms + 3ms,总计27ms

ID      Heap Size       Allocated       Free            %Used    #Objects
1        10.816 MB      3.191 MB        7.625 MB        29.50%    45,525    


This adb log right after change


                   Pss  Private  Private  Swapped     Heap     Heap     Heap
                 Total    Dirty    Clean    Dirty     Size    Alloc     Free
                ------   ------   ------   ------   ------   ------   ------
  Native Heap        0        0        0        0    16728     4346       29
  Dalvik Heap     1654     1576        0        0    11076     3348     7728
 Dalvik Other     1435     1296        0        0
        Stack      100      100        0        0
    Other dev    63332    32644        4        0
     .so mmap     1110      692      116        0
    .apk mmap        7        0        4        0
    .dex mmap      586       20      368        0
   Other mmap        5        4        0        0
      Unknown     1504     1488        0        0
        TOTAL    69733    37820      492        0    27804     7694     7757

 Objects
               Views:        1         ViewRootImpl:        0
         AppContexts:        3           Activities:        0
              Assets:        2        AssetManagers:        2
       Local Binders:       10        Proxy Binders:       17
    Death Recipients:        0
     OpenSSL Sockets:        0

 SQL
         MEMORY_USED:        0
  PAGECACHE_OVERFLOW:        0          MALLOC_SIZE:        0

应用程序中显示的内存现在为117MB 这种情况在不断增加,第二天早上app中显示的大小约为150 MB。

我需要一些指示,以便更好地理解这一点。

1 个答案:

答案 0 :(得分:0)

针对您无法控制的代码中的资源泄漏的一种补救措施是重新启动应用程序。您可以kill the process System.exit()

但在此之前,您必须schedule a restart

请注意,虽然不同的Android版本都应该兼容,但它们在应用程序重启行为方面不兼容。至少,v2.x和v4.0确实不同(在v2.x中System.exit()导致应用程序重启,最顶层的活动关闭),不确定最新版本。