【问题标题】:Memory Management in AndroidAndroid中的内存管理
【发布时间】:2012-03-29 13:14:19
【问题描述】:

所以,我第一次使用 Monkey 测试测试了我的游戏。我设法在没有崩溃的情况下运行了大约 3 分钟,但最终由于内存不足错误而崩溃,我正在尝试弄清楚如何让它变得更好。

我的程序结构如下:

  • 有一个前屏可以启动一个活动。
  • 次要活动是大部分动作发生的地方,也是我崩溃的地方。
  • 我在执行充气命令时崩溃
  • 我的游戏强制竖屏模式,1个布局比2个工作更容易...
  • 有许多与我的次要活动相关的类变量。我将在下面包括非静态的。我还为那些不明显的东西提供了一些线索。

我想知道的是如何改进程序的内存管理使其不会崩溃。我怀疑我需要手动删除其中一些变量,但我不确定这样做的正确位置是什么。谢谢!

private Level_Score_bar score_bar; // Custom view
private number_viewer num_viewer; // Custom view
private number_pad num_pad;       // Custom View
private int time,score,level,num_remaining,current_var,change_loc,time_remaining;
private ArrayList<Integer> the_key;
private ImageView Number_to_select;
private Boolean update_viewer; 
Random rseed;
Vibrator bzzz;
long ctime;
private Activity self=this;

private SharedPreferences prefs;
private Editor prefs_edit;

内存不足

   setContentView(R.layout.level_layout);

这种布局相当复杂,包含多个图像视图、按钮、文本视图等。

【问题讨论】:

  • 很高兴知道您在代码中的哪个位置获得了 OOM。如果可以,请发布堆栈跟踪和相关代码。不是很相关,但根据 Java 命名约定,变量不应该有下划线(除非它是静态 final),而是与下一个单词中的第一个字母大写:docs.oracle.com/javase/tutorial/java/nutsandbolts/…
  • @Jave:包含内存不足的行。有一天我也应该学习 Java 约定,我可能会继续努力……
  • R.layout.level_layout 包含什么?大图还是类似的?
  • @Jave:很多东西,但有几个图像视图、图像按钮、文本视图等。它们都不是特别大,但我想它们加起来。
  • 你试过System.gc();调用手动垃圾收集器?

标签: java android memory-management memory-leaks


【解决方案1】:

事实证明,我就在堆的毛茸茸的边缘。我使用了很多图像,结果证明我超过了“正常”堆大小。我设法通过缩小一些图像来改善这种情况,但最好的解决方案是将我的清单更改为以下内容:

<application 
    android:label="@string/app_name" 
    android:icon="@drawable/logo" 
    android:screenOrientation="portrait" 
android:largeHeap="true">

大堆将允许我进行未来的升级(其中将包括关卡设计等,这将占用相当多的空间......)总而言之,它应该是一个非常小的影响。

我选择了@Booger 的答案,因为这让我可以进行一些研究并发现我的堆空间不够大,但我还包括了@Ramam-Mystry 的一段代码。

在我的任务中,我还使用了来自 excellent question 的许多答案。我开始存储引用而不是位图,以及其他一些相关位。总而言之,我的内存消耗下降了 25%,并且还在继续改善。

另一个技巧可能是在 Activity 中使用 onLowMemory() 函数,然后修剪不需要的内存。

【讨论】:

    【解决方案2】:

    听起来您需要查看“分配跟踪器”工具,该工具可在 eclipse 中的“DDMS 透视图”中找到。

    这将准确显示哪些数据结构正在消耗内存。

    【讨论】:

    • 我对什么在消耗内存有一个很好的了解,但我不太确定我需要做什么......
    • 您需要确切地知道是哪个组件导致了您的内存问题,然后才能专注于修复它。您可以调整您的范围,以确保在正确的时间创建\删除变量,您还可以在内存中缓存一些经常访问的项目,以确保您只创建单个实例。
    【解决方案3】:

    尝试在onresume() 中使用System.gc();,以避免在imageview 中使用高分辨率或高内存图片时出现内存泄漏。

    注意: 对于使用位图的imageviews,默认的垃圾回收不会被调用,所以当images内存较高时,执行内存会超过分配的内存。手动进行垃圾收集以避免内存泄漏。最好调用 onresume();

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      • 2011-01-05
      • 2014-04-13
      • 2016-10-20
      相关资源
      最近更新 更多