2012-03-29 113 views
0

所以,我用Monkey测试第一次测试了我的游戏。我设法在没有崩溃的情况下运行了大约3分钟,但最终崩溃时出现了内存不足的错误,我试图弄清楚如何让它变得更好。Android中的内存管理

  • 有一个正面的屏幕将开始一项活动:

    我的程序结构如下。

  • 次要活动是大部分行动的地方,也是我坠毁的地方。上充气命令
  • 我崩溃
  • 我的游戏势力肖像模式,它更容易让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); 

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

+0

很高兴知道你的代码在哪里得到了OOM。如果可以的话,发布堆栈跟踪和相关代码片段。 没有真正相关,但根据Java命名约定,变量不应该有下划线(除非它是静态最终的),而是应与下一个字中的第一个字母一起写入大写: http://docs.oracle.com .com/javase/tutorial/java/nutsandbolts/variables.html – Jave 2012-03-29 13:22:21

+0

@Jave:包含内存不足的行。我也应该学习Java约定,我可能会研究这个...... – PearsonArtPhoto 2012-03-29 13:25:10

+0

“R.layout.level_layout”包含什么?大图像或类似? – Jave 2012-03-29 13:26:10

回答

2

这听起来像你需要检查出“Allocation Tracker”工具,可在日蚀中的“DDMS”透视图中找到。

这会告诉你究竟哪些数据结构正在消耗内存

+0

我有一个公平的想法,什么是消费内存,但我不太确定我需要做些什么... – PearsonArtPhoto 2012-03-29 13:50:34

+0

你需要确切地知道哪个组件导致你的内存问题,比你可以专注于修复那。您可以调整范围,以确保在正确的时间创建\删除变量,还可以将一些经常访问的项目缓存在内存中,以确保您只创建单个实例。 – Booger 2012-03-29 13:57:15

1

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

注意: 对于使用位图的图像查看,默认垃圾回收未被调用,因此当图像内存较高时,执行内存超过了分配的内存。手动garbasge收集完成,以避免内存泄漏。最好调用onresume();

3

所以事实证明,我是在堆的毛边。我使用了不少图像,结果证明我已经超过了“正常”的堆大小。我已经成功通过缩小一些图片来改善这种情况,但最好的解决方案来改变我的表现为以下内容:

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

的一大堆让我做未来的升级(其中包括水平设计等,这将占用相当多的空间......)总而言之,它应该是一个相当小的影响。

我选择了@ Booger的回答,因为这是允许我做一些研究并发现我的堆空间不够大的一块,但我还包括了@ Ramam-Mystry的一段代码。

我也用过这个excellent question在我的任务中的很多答案。我开始存储引用而不是位图,以及一些其他相关位。总而言之,我的记忆体消耗下降了25%,并持续改善。

另一个提示可能是使用Activity中的onLowMemory()函数,修剪当时不需要的内存。