java 確認 モニタ - Androidで自分のアプリケーションのメモリ使用量を検出するにはどうすればよいですか?



4 Answers

はい、メモリ情報をプログラムで取得して、メモリ集約的な作業を行うかどうかを決定できます。

呼び出すことによってVMヒープサイズを取得する:

Runtime.getRuntime().totalMemory();

呼び出すことによって割り当てられたVMメモリを取得する:

Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();

呼び出しによるVMヒープサイズ制限の取得:

Runtime.getRuntime().maxMemory()

呼び出すことによってネイティブ割り当てメモリを取得する:

Debug.getNativeHeapAllocatedSize();

OutOfMemoryErrorの動作を把握し、メモリの使用状況を監視するアプリを作った。

https://play.google.com/store/apps/details?id=net.coocood.oomresearch

ソースコードはhttps://github.com/coocood/oom-researchで入手できhttps://github.com/coocood/oom-research

studio リーク 調査

私のAndroidアプリケーションで使用されているメモリをプログラムでどのように見つけることができますか?

私はそれを行う方法があることを願っています。 さらに、どうすれば電話機の空きメモリも手に入れられますか?




Hackbod'sはスタックオーバーフローに関する最善の答えの1つです。 非常に不明瞭な被写体に光を当てます。 それは私をたくさん助けました。

もう1つの本当に有益な情報源は、必見のビデオです: Google I / O 2011:Android Appsのメモリ管理

更新:

Process Stats あなたのアプリがメモリをどのように管理しているかを発見するサービスブログの記事で説明していますプロセスの統計: Dianne HackbornによるあなたのアプリケーションのRAM使用方法の理解




1)私は、少なくともJavaからではないと思います。
2)

ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
MemoryInfo mi = new MemoryInfo();
activityManager.getMemoryInfo(mi);
Log.i("memory free", "" + mi.availMem);



あなたが間違いなく助けてくれると思われる多くの答えがありますが私の考えを助けることができると思います。

Hackbod氏は次のように述べています。つまり、実際に各プロセスにマップされているすべての物理RAMを取り出し、すべてのプロセスを追加する場合は、実際の合計RAMよりもはるかに大きな数になるでしょう。 プロセスごとに正確な量のメモリを取得する方法はありません。

しかし、あなたはいくつかの論理によってそれに近づくことができます。

上に挙げたandroid.os.Debug.MemoryInfoActivityManager.getMemoryInfo()ようなAPIがあります。既に読んでいるかもしれませんが、私は他の方法について話します

最初に、それを動作させるにはrootユーザーである必要があります。 su in in processを実行してroot特権でコンソールに入り、 output and input streamを取得しoutput and input stream 。 出力ストリームにid\n (enter)を渡し、出力に書き出します。入力ストリームにuid=0が含まれていると、rootユーザになります。

ここでは、上記のプロセスで使用するロジックを示します

プロセスのouputstreamを取得すると、idの代わりに\n使って(procrank、dumpsys meminfoなど)コマンドを渡し、そのinputstreamストリームを取得し、ストリームをバイト[]、char []などに格納します。あなたは終わった!!!!!

許可:

<uses-permission android:name="android.permission.FACTORY_TEST"/>

rootユーザーであることを確認してください。

// su command to get root access
Process process = Runtime.getRuntime().exec("su");         
DataOutputStream dataOutputStream = 
                           new DataOutputStream(process.getOutputStream());
DataInputStream dataInputStream = 
                           new DataInputStream(process.getInputStream());
if (dataInputStream != null && dataOutputStream != null) {
   // write id to console with enter
   dataOutputStream.writeBytes("id\n");                   
   dataOutputStream.flush();
   String Uid = dataInputStream.readLine();
   // read output and check if uid is there
   if (Uid.contains("uid=0")) {                           
      // you are root user
   } 
}

suコマンドを実行する

Process process = Runtime.getRuntime().exec("su");         
DataOutputStream dataOutputStream = 
                           new DataOutputStream(process.getOutputStream());
if (dataOutputStream != null) {
 // adb command
 dataOutputStream.writeBytes("procrank\n");             
 dataOutputStream.flush();
 BufferedInputStream bufferedInputStream = 
                     new BufferedInputStream(process.getInputStream());
 // this is important as it takes times to return to next line so wait
 // else you with get empty bytes in buffered stream 
 try {
       Thread.sleep(10000);
 } catch (InterruptedException e) {                     
       e.printStackTrace();
 }
 // read buffered stream into byte,char etc.
 byte[] bff = new byte[bufferedInputStream.available()];
 bufferedInputStream.read(bff);
 bufferedInputStream.close();
 }
}

logcat:

いくつかのインスタンスではなく、コンソールから単一の文字列の生データを取得します。これは、手動で分離する必要があるため、格納するのが複雑です

これはちょうど試みです、私が何かを逃したならば私に示唆してください




Related