byte数组(byte[],boolean[])保留了大部分内存分配,而在应用程序中没有使用byte[]



在我的应用程序中,我有一个活动,其中有一个viewPager和8个片段,还有一个片段中的另一个View寻呼机和3个正在运行的服务。我专门用于图像的总堆约为1mb,但当我的应用程序启动时(在实际设备中),我的堆会增长到17mb(任何东西启动之前的基本堆是8mb,所以这意味着堆会增长9mb)在模拟器上,我看到这个堆是如何增长的。在跟踪我的堆后,我发现其中7 mb是专门用于的

byte array (byte[], boolean[])

和3 mb到

byte array (short[], char[])

虽然我在我的应用程序中绝对没有使用byte[],每次我在完成后用于解码图像等时,我都会将其引用为空。在使用分配跟踪器进行跟踪后,我发现总共376个中有360个引用了这个跟踪:

  at java.lang.Float.valueOf(Float.java:397)    
  at   android.animation.PropertyValuesHolder$FloatPropertyValuesHolder.setAnimatedValue(PropertyValuesHolder.java:947) 
  at android.animation.ObjectAnimator.animateValue(ObjectAnimator.java:476) 
  at android.animation.ValueAnimator.animationFrame(ValueAnimator.java:1123)    
  at           android.animation.ValueAnimator$AnimationHandler.handleMessage(ValueAnimator.java:630)   
  at android.os.Handler.dispatchMessage(Handler.java:99)    
  at android.os.Looper.loop(Looper.java:137)    
  at android.app.ActivityThread.main(ActivityThread.java:4441)  
  at java.lang.reflect.Method.invokeNative(Native Method)   
  at java.lang.reflect.Method.invoke(Method.java:511)   
  at 
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)    
 at dalvik.system.NativeStart.main(Native Method)   

很抱歉让人头疼,所以最后我的问题是,对于应用程序中的堆来说,17mb太多还是正常大小,根据这些跟踪,我应该在哪里以及什么类型的数据中搜索内存泄漏?(上下文、处理程序、循环程序…)?提前感谢

此外,我可能会补充一点,我有10倍的始终使用(Looper.getMainLooper)的Handlers,这会是一个问题吗?

这些字节数组实际上是位图图像数据。所以这是正确的。但是,不能仅使Bitmap引用为空。先呼叫Bitmap.recycle();。请记住,这些数据不会立即释放。GC必须发生。但是不要在生产代码中强制GC。相反,如果BuildConfig.DEBUGtrue,则可能在ActivityonStop();中执行System.gc();

相关内容

最新更新