java.lang.OutOfMemoryError 怎样彻底释放掉一个Activity的资源?解决方法

   阅读
java.lang.OutOfMemoryError 怎样彻底释放掉一个Activity的资源?
以前有看到一篇文章说, 可以向系统申请更多内存, 但我现在找不到了, 麻烦知道的人告诉我一下。

Java code
private int[] arr = new int[4 * 1024 * 1024];

在Activity1定义这样一个数组,结束Activity1跳到Activity2
然后结束Activity2跳到Activity1。如果是模拟器或中兴的V880之类的,基本上就会OutOfMemoryError了。
我是专门写了这个简单的测试程序,所以不必怀疑有Cursor没有关闭、泄露”了Context之类的问题。

用正点工具箱的任务管理,发现Activity1结束后(指finish();谁能说下有没更好的结束方法?),arr内存并没有释放掉。
于是我猜测当第二次进入Activity1的一瞬间,将需要双倍arr大小的内存,而导致OutOfMemoryError。
总之呢我需要彻底释放掉一个Activity的资源的方法……

------解决方案--------------------
探讨
以前有看到一篇文章说, 可以向系统申请更多内存, 但我现在找不到了, 麻烦知道的人告诉我一下。

Java code
private int[] arr = new int[4 * 1024 * 1024];

在Activity1定义这样一个数组,结束Activity1跳到Activity2
然后结束Activity2跳到Activity1。如果是模拟器或中兴的V880之类的,基本上就……

------解决方案--------------------
你重写finish方法然后手动调用一下GC。看可以吗。
------解决方案--------------------
探讨
以前有看到一篇文章说, 可以向系统申请更多内存, 但我现在找不到了, 麻烦知道的人告诉我一下。

Java code
private int[] arr = new int[4 * 1024 * 1024];

在Activity1定义这样一个数组,结束Activity1跳到Activity2
然后结束Activity2跳到Activity1。如果是模拟器或中兴的V880之类的,基本上就……

------解决方案--------------------
探讨

试了一下,貌似没什么效果。
Java code

// 定义堆大小
private final static int CWJ_HEAP_SIZE = 512 * 1024 * 1024;

都这样了,测试程序还是 OutOfMemoryError

------解决方案--------------------
期待更好的解决思路或者是方案
------解决方案--------------------
楼主是想释放资源,还是想分配内存呢。

如果释放资源,为什么要注释arr = null,同时你的gc的位置也不对。
arr分配空间是在activity1类实例创建的时候,oncreate所做的事情是在创建完成之后的动作。
最好的办法就是在onDestroy里面强制释放。

arr = null;
System.gc();

如果你想单纯的分配内存,如果手机允许,使用
VMRuntime.getRuntime().setMinimumHeapSize(8 * 1024 * 1024);
------解决方案--------------------
这个得看你的android系统配置的最大heapsize了

可以通过

getprop dalvik.vm.heapsize得到最大heapsize。
如果没有得到,那么最大heapsize就只有默认的,这是16M。

一般虚拟机起来,就要占用5M左右的memory吧, 自己估计一下你能handle的memory是多少,要出去系统开销
------解决方案--------------------
探讨
引用:

试了一下,貌似没什么效果。
Java code

// 定义堆大小
private final static int CWJ_HEAP_SIZE = 512 * 1024 * 1024;

都这样了,测试程序还是 OutOfMemoryError

确实这个不能根本解决问题,只能靠自己,如何优化内存

------解决方案--------------------
又是没有源代码的情况,自己下载 MAT 工具分析吧
------解决方案--------------------
下载 MAT 工具,分析一下吧
------解决方案--------------------
探讨

引用:

楼主是想释放资源,还是想分配内存呢。

如果释放资源,为什么要注释arr = null,同时你的gc的位置也不对。
arr分配空间是在activity1类实例创建的时候,oncreate所做的事情是在创建完成之后的动作。
最好的办法就是在onDestroy里面强制释放。

arr = null;
System.gc();

如果……

------解决方案--------------------
探讨

引用:

楼主是想释放资源,还是想分配内存呢。

如果释放资源,为什么要注释arr = null,同时你的gc的位置也不对。
arr分配空间是在activity1类实例创建的时候,oncreate所做的事情是在创建完成之后的动作。
最好的办法就是在onDestroy里面强制释放。

arr = null;
阅读