我得到这个奇怪的OutOfMemoryError,虽然dalvikvm报告了足够的堆空间.日志:
12-09 14:16:05.527: D/dalvikvm(10040): GC_FOR_ALLOC freed 551K, 21% free 38000K/47687K, paused 173ms, total 173ms
12-09 14:16:05.527: I/dalvikvm-heap(10040): Grow heap (frag case) to 38.369MB for 858416-byte allocation
12-09 14:16:05.699: D/dalvikvm(10040): GC_FOR_ALLOC freed 6K, 21% free 38832K/48583K, paused 169ms, total 169ms
12-09 14:16:05.894: D/dalvikvm(10040): GC_FOR_ALLOC freed 103K, 20% free 38929K/48583K, paused 169ms, total 169ms
12-09 14:16:05.894: I/dalvikvm-heap(10040): Forcing collection of SoftReferences for 858416-byte allocation
12-09 14:16:06.074: D/dalvikvm(10040): GC_BEFORE_OOM freed 6K, 20% free 38922K/48583K, paused 182ms, total 182ms
12-09 14:16:06.074: E/dalvikvm-heap(10040): Out of …Run Code Online (Sandbox Code Playgroud) 我看到不一致的文档和讨论有关Android内存不足时发生的情况以及操作系统重新声明内存的步骤.更具体地说,Android会以活动/片段或整个过程的粒度杀死吗?
例如,如果活动B在活动A前面启动(并且两个活动都是同一个应用程序/进程的一部分),活动A可以被操作系统杀死,而活动B位于前台,用户正在与活动B交互(假设:屏幕保持打开,当前应用程序保持在前台,没有发生方向更改)?
这个苏答案(在Android团队在谷歌的戴安娜Hackborn),从2011年表明,Android的杀死在流程的粒度,并不是一项活动.
在对Android开发者页面重新创建一个活动,它说:
如果系统当前已停止且未长时间使用或前台活动需要更多资源,系统也可能会破坏您的活动,因此系统必须关闭后台进程才能恢复内存.
注意歧义:"系统必须关闭后台进程 ".
在onSaveInstanceState的Android Developer页面上,它说:
例如,如果活动B在活动A前面启动,并且在某些时候活动A被杀死以回收资源,活动A将有机会通过此方法保存其用户界面的当前状态
在阅读了这些以及许多其他文档页面和在线讨论后,尚不清楚正确的答案是什么.
我也有关于片段的相同问题:由于内存不足而导致背景片段被杀死,而整个过程是否被杀死?
我使用图像设置为我所有活动的背景但它导致内存溢出问题并使应用程序崩溃.现在我在我的活动中解除暂停()和Destroy()上的drawables,现在按下后退按钮显示空白屏幕.那么如何在不使用额外内存的情况下避免这种情况
protected void onPause(){
super.onPause();
unbindDrawables(findViewById(R.id.login_root));
}
protected void onDestroy() {
unbindDrawables(findViewById(R.id.login_root));
super.onDestroy();
}
private void unbindDrawables(View view) {
System.gc();
Runtime.getRuntime().gc();
if (view.getBackground() != null) {
view.getBackground().setCallback(null);
}
if (view instanceof ViewGroup) {
for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
unbindDrawables(((ViewGroup) view).getChildAt(i));
}
((ViewGroup) view).removeAllViews();
}
Run Code Online (Sandbox Code Playgroud)
最初我使用android:background ="@ drawable /"来夸大我的布局,这总是导致内存溢出错误,说VM不会让我们分配10MB(app.)现在我从那个drawable得到一个位图而不缩小和绑定它在运行时.现在它说VM不会让我们分配5MB(app.)而不使用unbindDrawables(..)显然,显示的背景图像的质量已经下降但是我无法理解如果我使用的是png文件为13KB,JVM如何处理请求需要5或10MB空间?
我已将我的布局语句从onCreate()转移到onResume()方法,但是应用程序在按下后退按钮时再次耗尽内存.
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
protected void onResume(){
setContentView(R.layout.home);
Bitmap bmp;
ImageView background = (ImageView)findViewById(R.id.iv_home_background);
InputStream is = getResources().openRawResource(R.drawable.background);
bmp = BitmapFactory.decodeStream(is);
background.setImageBitmap(bmp); …Run Code Online (Sandbox Code Playgroud) 我有布局内存问题.当我有一个大型webview时它没有显示任何内容,并且logcat显示"View太大而无法适应绘图缓存".
布局是:
<ScrollView
android:id="@+id/scrollNoticia"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/ficha_curva"
android:layout_below="@+id/linea"
android:scrollbars="none"
>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="12dp"
>
<WebView
android:id="@+id/webViewNoticia"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scrollbars="none"
/>
<GridView
android:id="@+id/gridGaleria"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/webViewNoticia"
android:horizontalSpacing="4dp"
android:verticalSpacing="4dp"
android:numColumns="4" >
</GridView>
</RelativeLayout>
</ScrollView>
Run Code Online (Sandbox Code Playgroud) 我试图围绕图片文件解码,但它无法捕获内存不足异常,并且应用程序崩溃.
我知道解码图片文件的一些技巧,比如子采样.但是我需要放大图片来查看细节,所以我不能对它进行过多的子采样.对于某些较新的设备,它可以成功分配更大的内存以避免内存不足异常.
对于一些较旧的设备,它不能.
如果我可以为不同的设备自定义我的应用程序,那将会很大.
所以我想:(1)我希望我可以解决内存不足异常,所以如果我抓住它,我可以减少图像大小.(2)或者,我希望我可以获得可用内存的大小进行分配.
我在网上搜索,找不到答案.
我猜Dalvik堆是固定的Android应用程序.像64MB,96MB等
这样对吗 ?.
如果是这样,本机堆也固定为某种大小?或将根据应用程序的使用增长?
有人可以帮帮我吗?谢谢.
我正在开发一个Android应用程序.其中我试图首次使用MAT找出内存泄漏.我评论了以下链接.
直到第3步它的工作.但是当我尝试运行第4步时,我在日食中遇到错误.错误日志是:
org.eclipse.core.runtime.CoreException: Plug-in "org.eclipse.mat.ui" was unable to instantiate class "org.eclipse.mat.ui.snapshot.editor.HeapEditor".
at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.throwException(RegistryStrategyOSGI.java:194)
at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:188)
at org.eclipse.core.internal.registry.ExtensionRegistry.createExecutableExtension(ExtensionRegistry.java:905)
at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension(ConfigurationElement.java:243)
at org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension(ConfigurationElementHandle.java:55)
at org.eclipse.ui.internal.WorkbenchPlugin.createExtension(WorkbenchPlugin.java:274)
at org.eclipse.ui.internal.registry.EditorDescriptor.createEditor(EditorDescriptor.java:235)
at org.eclipse.ui.internal.EditorReference.createPart(EditorReference.java:318)
at org.eclipse.ui.internal.e4.compatibility.CompatibilityPart.createPart(CompatibilityPart.java:266)
at org.eclipse.ui.internal.e4.compatibility.CompatibilityEditor.createPart(CompatibilityEditor.java:61)
at org.eclipse.ui.internal.e4.compatibility.CompatibilityPart.create(CompatibilityPart.java:304)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:56)
at org.eclipse.e4.core.internal.di.InjectorImpl.processAnnotated(InjectorImpl.java:877)
at org.eclipse.e4.core.internal.di.InjectorImpl.processAnnotated(InjectorImpl.java:857)
at org.eclipse.e4.core.internal.di.InjectorImpl.inject(InjectorImpl.java:119)
at org.eclipse.e4.core.internal.di.InjectorImpl.internalMake(InjectorImpl.java:333)
at org.eclipse.e4.core.internal.di.InjectorImpl.make(InjectorImpl.java:254)
at org.eclipse.e4.core.contexts.ContextInjectionFactory.make(ContextInjectionFactory.java:162)
at org.eclipse.e4.ui.internal.workbench.ReflectionContributionFactory.createFromBundle(ReflectionContributionFactory.java:102)
at org.eclipse.e4.ui.internal.workbench.ReflectionContributionFactory.doCreate(ReflectionContributionFactory.java:71)
at org.eclipse.e4.ui.internal.workbench.ReflectionContributionFactory.create(ReflectionContributionFactory.java:53)
at org.eclipse.e4.ui.workbench.renderers.swt.ContributedPartRenderer.createWidget(ContributedPartRenderer.java:129)
at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createWidget(PartRenderingEngine.java:949)
at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:633)
at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:735)
at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.access$2(PartRenderingEngine.java:706)
at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$7.run(PartRenderingEngine.java:700)
at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createGui(PartRenderingEngine.java:685)
at …Run Code Online (Sandbox Code Playgroud) android memory-leaks eclipse-mat eclipse-memory-analyzer android-memory
在我的Android应用程序中,要求是从服务器获取图像并将它们缓存到堆内存中.
收到请求后,服务器首先对byte[]into进行编码Base64String并返回该字符串.并且,在将其呈现到ImageViewAndroid应用程序时,将其解码Base64String回byte[],创建一个Bitmap并将其打开ImageView.
由于所有内容都在缓存中,因此应用程序有可能在某些时候内存不足,并严重崩溃.
为了防止内存不足,我在我的应用程序中定义了一个安全量程(例如5 MB).如果在任何时候可用内存低于此安全量程,则用户需要将一些图像标记为要删除的候选者.与此同时,应用程序将显示清除所选项目后将释放的估计内存.
在Bitmap已经回收的一次用户离开图像了,所以Bitmap实际上是不持有任何记忆,只要我们离开.
在一个特定的测试中,我下载了55个图像,我的堆从增长16 MB到42 MB.这意味着,55张图像占据了26 MB.在我清除了所有这些之后,堆缩回了16 MB.
但是,当我拿出所有Base64String它的累积长度时,它就会出现11983840.如果我认为一个字符作为1 byte该11983840 bytes品牌11.4 MB
问题是,长度的累积总和Base64String是唯一可用的度量,这有助于让用户知道他的选择可以释放多少内存.
我也看到了以下问题,其中提到,每个3 Bytes原始数据的Base64String都会有4 Characters.
问题是,单个字符中Base64String包含多少字节?1,2或更多
如果1 character是1 byte,并且在我的测试中,堆增长和缩小了26 …
base64 android heap-memory character-encoding android-memory
我是Android的新手,我为初学者读了一本书,表示onSaveInstanceState(Bundle)在系统回收你之前确保被调用Activity.我尝试了一些测试代码并发现它不正确.我发现onSaveInstanceState(Bundle)每次调用后都会onPause()调用它.它与系统回收无关.我不是很确定,所以这就是问题:onSaveInstanceState(Bundle)实际上什么时候被调用?
我不时会在Android Studio中使用Memory Monitor和HPROF Viewer来检查是否存在任何内存泄漏和内存使用情况.
我相信我知道查看器中使用的大多数符号和颜色的含义,但我想确定并且不仅仅是对它们有自己的理解.我没有在网上找到任何解释,但我确信我的问题的答案非常简单.
参考文献3中的下列符号是什么意思?
当实例的字体颜色为蓝色,红色,粗体或斜体时,这意味着什么?
有时符号1,2和3可以在同一实例中组合.这是否意味着特别的东西?
当悬停不同的图标时,我对HPROF Viewer的功能请求是一个工具提示.
android ×10
android-memory ×10
android-view ×1
base64 ×1
caching ×1
eclipse-mat ×1
heap-dump ×1
heap-memory ×1
hprof ×1
java ×1
memory ×1
memory-leaks ×1