java - Android 中的内存管理

标签 java android memory-management memory-leaks

因此,我第一次使用 Monkey 测试来测试我的游戏。我设法在大约 3 分钟内没有发生崩溃,但最终因内存不足错误而崩溃,我正在尝试找出如何改进的方法。

我的程序结构如下:

  • 有一个前屏幕将启动一项 Activity 。
  • 次要 Activity 是大部分操作所在,也是我崩溃的地方。
  • 我因 inflate 命令而崩溃
  • 我的游戏强制采用纵向模式,制作 1 个布局比制作 2 个作品更容易...
  • 有许多与我的次要 Activity 相关的类变量。我将在下面包括非静态的。我还为那些不太明显的事物提供了某种线索。

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

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);

这个布局相当复杂,包含多个 ImageView 、按钮、 TextView 等。

最佳答案

事实证明,我正处于堆的毛茸茸的边缘。我使用了相当多的图像,结果发现我超过了“正常”堆大小。我已经通过缩小一些图像来改善这种情况,但最好的解决方案是将我的 list 更改为以下内容:

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

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

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

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

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

关于java - Android 中的内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9926092/

相关文章:

android - 将图像从 drawable 设置为 recyclerview

iphone - 应用程序中分配了很多内存,如何解决?

java - android:tableview中的xml解析输出

java - 如何在 h :selectOneMenu? 中更改值时在 ajax 请求中传递附加参数

java - git - 推送 java .classpath 文件?

android - 从 sqlite 运行选择

Java SystemTray 图标并不总是有效

android - 无法解析方法 setClient(okhttp3.OkHttpClient)

C——内存管理

java - 在 java 包装器类中使用 new 运算符的内存分配有什么不同吗?