[Java] Androidで自分のアプリケーションのメモリ使用量を検出するにはどうすればよいですか?


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

Question

私の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);



上記の多くの答えが間違いなくあなたを助けますが、私は私の意見を助けることができると思うので、私は2日後にadbメモリーツールを研究しています)

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

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

上に挙げたandroid.os.Debug.MemoryInfoActivityManager.getMemoryInfo()ようなAPIがありますが、これについてはすでに読んで使用しているかもしれませんが、別の方法(間接的なもの)

最初に、それを動作させるにはrootユーザーである必要があります。 suプロセスを実行してroot権限でコンソールに入り、そのoutput and input streamを取得する。ouputstreamにid\n (enter)を渡してプロセス出力に書き込む。uid uid=0を含むinputstreamを取得すると、 rootユーザー。

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

プロセスのouputstreamを取得すると、idの代わりに\n使ってコマンド(procrank、dumpsys meminfoなど)を inputstream 、そのinputstreamストリームを取得して読み込み、バイト単位でストリームを格納したり、charなどのデータを使用したりします。完了!!!!!

許可:

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

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

try {
    // 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")) {                           
             // yes sir you are root user
         } 
    }
} catch (Exception e) {
}

suコマンドを実行する

try {
      // 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();
      }
} catch (Exception e) {
}

logcat:

これは解決策ではなく、いくつかのインスタンスやAPIからデータを取得するのではなく、コンソールから取得したのと同じように単一の文字列で生データを取得します。これは管理が非常に難しく、それを手動で分けてください

これはちょうど試しです、私が間違っている場合は私を修正してください




Links