我对这个关于Android操作系统的内存管理的问题很好奇,所以我希望对这个主题有一个非常详细的答案.
我想知道的是:
最重要的是:
到目前为止我所听到的(直到2013年):
是什么让我很好奇:
这两个限制都非常低.
我刚刚下载了Android任务管理器来检查我的设备RAM.我注意到有些应用程序使用大约40-50兆字节的RAM,这比上面提到的最大RAM使用量(比如说32 MB)要多得多.那么Android如何确定应用程序可以使用多少RAM?应用程序如何超出此限制?
此外,我注意到当使用大约30-40兆字节时,我的一些应用程序崩溃(被系统杀死?)和OutOfMemoryException.另一方面,我的手机上运行的应用程序使用100 MB以上的一段时间后(可能由于内存泄漏)不会崩溃或被杀死.因此,在确定可以节省多少RAM时,显然还取决于应用程序本身.这怎么可能?(我用带有768 MB RAM的HTC One S进行了测试)
免责声明:我不以任何方式与Android任务管理器应用程序相关联.
memory android memory-management out-of-memory android-memory
我正在开发一个简单的应用程序 刚刚完成主屏幕.如果方向变化超过两次,则抛出错误并且应用程序强制关闭.
public class PasswordActivity extends Activity implements OnClickListener {
Button login;
Button forgot;
Button register;
private static final String PREFERENCES = "prefs";
private static final String PREFERENCES_NAME = "pref_name";
SharedPreferences settings;
private Cursor c;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
login=(Button)findViewById(R.id.login_login);
login.setOnClickListener(this);
register=(Button)findViewById(R.id.login_register);
register.setOnClickListener(this);
}
public void onClick(View v) {
}
}
Run Code Online (Sandbox Code Playgroud)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:background="@drawable/listpic"
>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:paddingTop="5dp"
android:paddingLeft="3dp"
android:paddingRight="3dp"
>
<TextView
android:layout_width="fill_parent"
android:layout_weight="0.75"
android:layout_height="wrap_content"
android:text="@string/login_user_name" …Run Code Online (Sandbox Code Playgroud) 我有一个启动器Activity加载和调整大位图的大小,因为它是打开时的背景.
每当按下后退按钮时,Activity就是destroyed.但我认为记忆尚未公布.
当我打开应用程序时,点击后退按钮再次打开它(反复),我会得到一个OutOfMemoryError.
我这个新手的问题,对不起,但我不知道我怎么释放每当记忆Activity是destroyed?
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_welcome);
//MARK - movingBackgroundImageView
movingBackgroundImageView = (ImageView) findViewById(R.id.movingBackgroundImageView);
movingBackgroundImageView.setColorFilter(Color.argb(255, 255, 255, 255));
movingBackgroundImageView.setScaleType(ImageView.ScaleType.MATRIX);
movingBackgroundImageView.setAlpha(0.28f);
prepareBackgroundAnimation();
}
private void prepareBackgroundAnimation() {
DisplayMetrics displaymetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
screenWidth = displaymetrics.widthPixels;
screenHeight = displaymetrics.heightPixels;
movingImageHeight = displaymetrics.heightPixels;
movingImageWidth = 1920.0 / 1080.0 * movingImageHeight;
bitmapImage = BitmapFactory.decodeResource(this.getResources(), R.drawable.moving_background_image);
scaledBitmap = bitmapImage.createScaledBitmap(bitmapImage, (int) movingImageWidth, (int) movingImageHeight, false);
movingBackgroundImageView.setImageBitmap(scaledBitmap);
backgroundImageInBeginning …Run Code Online (Sandbox Code Playgroud) android out-of-memory android-memory android-studio android-bitmap
我与一些团队成员开发了一个Android应用程序,通过移动设备收集现场数据.
现在这个应用程序将投入生产.所以普通人会使用这个应用程序.我们还需要创建一个文档来解释我的Android应用程序中引入的所有内容以及运行此应用程序的最低硬件要求是什么,没有错误.
现在我怎么知道什么是最低硬件要求.
基本上在我的约四的应用TextField,三Spinner,Date,EditText和两个ImageView.
所以我怎么知道运行这个应用程序的最低内存要求是什么.
我已经在其中一个移动设备中尝试了这个应用程序,其中几乎所有内存都被其他应用程序使用.我的应用程序无法捕获照片.当我删除一些应用程序,然后我的应用程序工作正常.
这就是为什么我想知道运行我的应用程序的最低内存要求是什么.
stopWriting = (Button) findViewById(R.id.save);
stopWriting.setOnClickListener(new OnClickListener() {
@SuppressLint("SdCardPath")
public void onClick(View v) {
// stop recording the sensor data
try {
myFile = new File("/sdcard/SensorData/" + txtData.getText() + ".txt");
myFile.createNewFile();
sData = new FileOutputStream(myFile);
myOutWriter = new OutputStreamWriter(sData);
myBufferedWriter = new BufferedWriter(myOutWriter);
myPrintWriter = new PrintWriter(myBufferedWriter);
//if(myFile != null )//stopFlag = mSensorManager.cancelTriggerSensor(null, null);
Toast.makeText(getBaseContext(), "Done", Toast.LENGTH_SHORT).show();
} catch (Exception e) {
Toast.makeText(getBaseContext(), e.getMessage(), Toast.LENGTH_SHORT).show();
}
}
});
Run Code Online (Sandbox Code Playgroud)
我试图将陀螺仪数据保存到txt文件,但它不保存.如果有人发现问题,请帮我纠正.
我正在开发一个应用程序,它有一个带有google plus登录按钮的LoginActivity.我已经在google的api控制台中启用了Google+ API并创建了一个Oauth帐户.
这是我的代码的相关部分:
活动类声明:
public class LoginActivity extends Activity implements OnClickListener,
ConnectionCallbacks, OnConnectionFailedListener, PlusClient.OnAccessRevokedListener {
private PlusClient mPlusClient;
private ConnectionResult mConnectionResult;
private static final int REQUEST_CODE_SIGN_IN = 2
Run Code Online (Sandbox Code Playgroud)
的onCreate:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
mPlusClient = new PlusClient.Builder(this, this, this)
.setActions("http://schemas.google.com/AddActivity").build();
Run Code Online (Sandbox Code Playgroud)
的onClick:
public void onClick(View view) {
Utils.LOGD("onClick - View = " + view);
if (view.getId() == R.id.sign_in_button) {
Utils.LOGD("onClick : mPlusClient status = " + mPlusClient);
if (mPlusClient.isConnected()) {
Utils.LOGD("onClick - mPlusClient is connected");
Toast.makeText(this, "you …Run Code Online (Sandbox Code Playgroud) debugging android google-api android-memory google-play-services
我试图使用Android Studio内存监视器中的"dump java heap"按钮获取.hprof文件,但由于某种原因没有生成.hprof文件.有人知道为什么吗?分配跟踪工作正常.
在启用largeHeap选项之前,我正在处理大型位图,它几乎消耗了应用程序可用的整个内存,并且通过导航回收它并加载新的内存几乎可以在完整的堆上运行.但是,当某些操作需要更多内存时,应用程序崩溃.所以我启用largeHeap=true了更多的内存.
但这样做有一个意外的行为,它看起来像recycle()位图的方法不工作的大部分时间,并在58MB工作的内存(并超过有时抛出的应用程序OutOfMemoryException)现在消耗内存成倍而且还在不断增加(目前测试我确实来了231Mb分配的内存),预期的行为是内存管理继续工作,应用程序将不会使用超过60Mb.
我怎么能避免这种情况?还是有效地回收位图?
编辑:实际上,我OutOfMemoryError在设备上分配超过390Mb的内存时给了它一个.读取GC_*日志显示只有GC_FOR_ALLOC有时会释放3.8Mb,但几乎从未在其他GC运行中释放过某些内容.
我正在尝试以编程方式分析hprof文件.在android-sdk中使用hprof-conv工具我生成了一堆com.your.package.index文件.
如何以编程方式解析这些.index文件?
我想在dominator树上运行一些自定义分析,这很容易通过MAT(Eclipse的Memory Analyzer)手动完成,但希望以自动方式完成.
我有一个Fragment有RecyclerView.
在这里RecyclerView,我偶尔可以下载并显示图像(加载Glide到ImageView.
因此,当我打开时Fragment,使用过的内存有时会从大约30MB跳到大约100MB甚至更多.
在Activity持有Fragment完成之后,内存不会释放.它和以前一样.
我检查滑翔文档,显然我们不必担心释放Bitmaps在RecyclerView.这是一个很大的问题,因为应用程序经常因为OOM而崩溃.
Fragment删除后我应该如何正确处理释放内存?
编辑:另一个观察
我注意到的另一件事是,如果我完成了Activity,然后Activity再次开始相同.内存将跳回一段时间然后再回到100MB,这让我相信在Fragment再次启动之前内存已被清除.
android-memory ×10
android ×9
debugging ×1
eclipse-mat ×1
google-api ×1
hprof ×1
java ×1
memory ×1
save ×1