我正在测试android 3.1,大堆大小的选项,大约250M的内存可用.
每当我点击应用程序首选项中的"测试"按钮时,我都会设置以下代码:
float [][][]foo = new float[3][2048][2048];
Bitmap bm = Bitmap.createBitmap(2048, 2048, Bitmap.Config.ARGB_8888);
bm.recycle();
bm = null;
foo = null;
Run Code Online (Sandbox Code Playgroud)
我有足够的记忆 - 我可以毫无问题地按几下按钮.
但是,如果我一直按下按钮,最终(少于20次点击)它会以OutOfMemory消失.[通常在android.graphics.Bitmap.nativeCreate(Native Method)中]
没有其他事情发生 - 我永远不必离开PreferencesActivity.当我点击按钮时,还会显示一个小Toast,因此正在进行少量其他UI活动.
这是由于碎片,还是Android Bitmap代码和/或GC中的一个可怕的错误?或者我只是在做一些愚蠢的事情?(请让它成为愚蠢的......)
有人有解决方法吗?因为上面的代码完全代表了我的代码每次用户调用它时所要做的事情,而且现在尽管细致地清除了变量,但它在几次使用后就会死掉.(这已经让我疯了很久了!)
[更新]
我已经确认这是一个碎片问题或gc错误,因为堆转储显示我在闲置(没有泄漏)时只使用5.6M处理期间大约26M达到峰值.(此外,本机堆保持在4M以下.)虽然java堆同时在我的测试设备上一直增长到280M限制,此时我开始获得OutOfMemory异常.所以我在峰值时只使用了10%的可用堆,但是获得OutOfMemory.
[不幸的是,添加对System.gc()的调用修复了我上面给出的简单测试用例.我说不幸,因为(A)它不应该有所作为,(B)因为我已经在我的实际代码中定期调用它,所以这意味着我上面的简单测试用例太简单了.
有没有其他人遇到这个?任何解决方法?有没有一种优雅的方式来重新启动我的应用程序?
[更新]
以下版本可以在3到4次调用中可靠地导致OutOfMemory(按下按钮):
float [][][]foo = new float[3][2048][2048];
Bitmap bm = Bitmap.createBitmap(2048, 2048, Bitmap.Config.ARGB_8888);
int []bar = new int[3*2048*2048];
bm.recycle();
bm = null;
System.gc();
foo = null;
System.gc();
bar = null;
System.gc();
Run Code Online (Sandbox Code Playgroud)
内存跟踪显示堆在每次调用时稳定增长,直到达到限制并死亡.如果我删除三个分配中的任何一个,它就会达到平衡并无限期地存活下来.删除除最后一个gc()之外的所有gc()会导致它稍早死亡.
我会说这是一个碎片问题,而不是gc bug本身.如果有人知道如何解决它,请告诉我.int []分配用于编写位图,因此我没有选择将其分配为2d数组(android Bitmap库的限制).
我没有内存错误.我正在进行实时聊天应用程序.它运行正常,但是当我在设备上运行应用程序1到2个小时时,堆大小正在增加,当它达到16 MB时,应用程序开始挂起并在一段时间后崩溃并显示,out of memory due to heap size因为生成的堆大小大于分配.
我在HTC Explorer上测试我的应用程序.在我的应用程序中,大多数活动都使用后台线程,因为我正在使用Asnyc Task.
我收到如下错误.
04-30 16:53:14.658: E/AndroidRuntime(5707): FATAL EXCEPTION: MagentoBackground
04-30 16:53:14.658: E/AndroidRuntime(5707): java.lang.OutOfMemoryError: (Heap Size=20167KB, Allocated=16063KB, Bitmap Size=355KB)
04-30 16:53:14.658: E/AndroidRuntime(5707): at org.apache.http.util.ByteArrayBuffer.<init>(ByteArrayBuffer.java:53)
04-30 16:53:14.658: E/AndroidRuntime(5707): at org.apache.http.impl.io.AbstractSessionInputBuffer.init(AbstractSessionInputBuffer.java:82)
04-30 16:53:14.658: E/AndroidRuntime(5707): at org.apache.http.impl.io.SocketInputBuffer.<init>(SocketInputBuffer.java:98)
04-30 16:53:14.658: E/AndroidRuntime(5707): at org.apache.http.impl.SocketHttpClientConnection.createSessionInputBuffer(SocketHttpClientConnection.java:83)
04-30 16:53:14.658: E/AndroidRuntime(5707): at org.apache.http.impl.conn.DefaultClientConnection.createSessionInputBuffer(DefaultClientConnection.java:170)
04-30 16:53:14.658: E/AndroidRuntime(5707): at org.apache.http.impl.SocketHttpClientConnection.bind(SocketHttpClientConnection.java:106)
04-30 16:53:14.658: E/AndroidRuntime(5707): at org.apache.http.impl.conn.DefaultClientConnection.openCompleted(DefaultClientConnection.java:129)
04-30 16:53:14.658: E/AndroidRuntime(5707): at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:173)
04-30 16:53:14.658: E/AndroidRuntime(5707): at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
04-30 16:53:14.658: E/AndroidRuntime(5707): at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
04-30 …Run Code Online (Sandbox Code Playgroud) 我的应用程序的主要目的是以图像中所示的以下方式显示图像
private void setSelectedImage(int selectedImagePosition)
{
BitmapDrawable bd = (BitmapDrawable) drawables.get(selectedImagePosition);
Bitmap b = Bitmap.createScaledBitmap(bd.getBitmap(), (int) (bd.getIntrinsicHeight() * 0.9), (int) (bd.getIntrinsicWidth() * 0.7), false);
selectedImageView.setImageBitmap(b);
selectedImageView.setScaleType(ScaleType.FIT_XY);
}
Run Code Online (Sandbox Code Playgroud)
详细代码可以在这里找到
在以下行引发异常
Bitmap b = Bitmap.createScaledBitmap(bd.getBitmap(), (int) (bd.getIntrinsicHeight() * 0.9), (int) (bd.getIntrinsicWidth() * 0.7), false);
Run Code Online (Sandbox Code Playgroud)
以上函数调用自onItemSelected.**该应用程序仍然在2.2和2.3上运行良好,但在4.1上立即抛出异常上面的代码工作正常,但抛出异常.我没有看到2.2和2.3中的任何崩溃,但它在4.1中立即崩溃了果冻豆中的内存管理是否有任何重大差异?**:
java.lang.OutOfMemoryError
AndroidRuntime(2616): at android.graphics.Bitmap.nativeCreate(Native Method)
AndroidRuntime(2616): at android.graphics.Bitmap.createBitmap(Bitmap.java:640)
AndroidRuntime(2616): at android.graphics.Bitmap.createBitmap(Bitmap.java:586)
AndroidRuntime(2616): at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:466)
AndroidRuntime(2616): at com.rdx.gallery.GalleryDemoActivity.setSelectedImage(GalleryDemoActivity.java:183)
Run Code Online (Sandbox Code Playgroud) 我目前正在开发一个讲述故事的应用程序.故事包含"场景",其中包含通过ImageViews显示的多个JPEG和PNG文件.我创建了ImageView并通过以下函数将其添加到布局中:
private ImageView newImage(Show show)
{
ImageView iv = new ImageView(this);
String filePath = comin.generateFilePath(show);
Log.i(TAG, "newImage, filePath = " + filePath + " id = " + show.id);
WeakReference<Bitmap> bmp = new WeakReference<Bitmap>(scaleBitmap(filePath)); //added 4/1/13
//Bitmap bmp = scaleBitmap(filePath);
Log.i(TAG, "newImage, width = " + bmp.get().getWidth() + ", height = " + bmp.get().getHeight());
iv.setImageBitmap(bmp.get());
iv.setScaleType(ImageView.ScaleType.FIT_XY);
iv.setId(show.id);
//set visibility
if (show.visible)
iv.setVisibility(View.VISIBLE);
else
iv.setVisibility(View.INVISIBLE);
//set dimensions
int width = (app.getWidth() * show.dimX) / 100;
int height = (app.getHeight() * show.dimY) …Run Code Online (Sandbox Code Playgroud) 当用户第一次打开它时,我的应用程序使用75MB内存.
我使用Android Studio中的Android Profiler工具来检查我的Android应用程序的内存使用情况.当主屏幕打开时,应用程序开始使用75MB内存,即使主活动不会创建任何需要太多内存的对象.没有位图或任何大数组等.
40MB来自"代码"部分,19MB来自"本机",我们在此活动中不加载任何本机库.我们在用户打开另一个Activity之后加载.我试图减少内存使用量,我想知道如何从"代码"和"本机"部分减少.
Android Profiler的屏幕截图
在Android操作系统的Google日历应用中,您将在CalendarActivity的onCreate方法中遇到此行.
// Eliminate extra GCs during startup by setting the initial heap size to 4MB.
VMRuntime.getRuntime().setMinimumHeapSize(INITIAL_HEAP_SIZE)
Run Code Online (Sandbox Code Playgroud)
有人可以解释为什么设置为4MB会消除GC吗?
是否有 Android 设备及其堆大小的列表?
我知道如何在应用程序中以编程方式进行检查,但我很想知道。
我的设备 Android 堆大小为 32M 或更大,并且它们至少有 512MB RAM。我是否可以简单地假设所有具有 512MB RAM 的设备都有 32M 的堆?内存较少的设备的堆也较少?(16mb?24mb????)
谢谢
所以我明白了:
'01-01 20:37:34.859: E/dalvikvm-heap(19921): Out of memory on a 6471856-byte allocation.'
Run Code Online (Sandbox Code Playgroud)
尝试将一堆变量分配给内存时.我正在分配24个这样的变量:
mElements.add(new ShopElement(getResources(),R.drawable.shop_starter, b1X , b1Y,true,1,"red",true,5,checkLocked(0)));
Run Code Online (Sandbox Code Playgroud)
其中一个:
bNumbers = new Bitmap[] {Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.h0)
, 65,65, true),
Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.h1)
, 65,65, true),
Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.h2)
, 65,65, true),
Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.h3)
, 65,65, true),
Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.h4)
,65,65,true),
Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.h5)
, 65,65, true),
Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.h6)
, 65,65, true),
Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.h7)
, 65,65, true),
Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.h8)
, 65,65, true),
Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.h9)
, 65,65, true),
Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.time)
, 50,50, true)};
Run Code Online (Sandbox Code Playgroud)
但在我能够通过我创建的24个元素中的第16个之前,它会在某些手机上崩溃.
我有一个Galaxy S2,它运行良好,但在 …
从Google的一个演示文稿中,我了解到各种硬件的最大堆大小如下 - "Android G1 = 16MB,Droid = 24 MB,Nexus One = 32 MB,Xoom = 48 MB"
对于特定硬件上的Android应用程序,是否有一种编程方法来确定每个应用程序的最大堆大小?
谢谢.
有没有办法,如何以编程方式(如分配和填充某些数组)检查,Dalvik在OutOfMemoryError出现之前分配了多少内存?是否有可能用Java做到这一点?