Androidのプロセス回収
自動回転
Androidのプロセスはホストであり、システムのプロセス空間が緊張している場合、優先順位に従って自動的にプロセスの回収を行います。
ここから三つの問題を持ってきました。
回収ルール: いつ回収しますか?どれを回収しますか?
誤殺を避ける: 回収を阻止するにはどうすればいいですか?
データの復元と保存: 回収されました。どうすればいいですか?
Androidはプロセスを6段階に分けて、優先順位は高い順から低い順に次のようになります。
1.フロントプロセス(FOREGROUND UAPP)2.テレビプロセス(VISIBLEuAPP)3.セカンダリサービスプロセス(SECONDARYUSERVER)4.バックグラウンドプロセス(HIDDEN_APP)5.コンテンツ供給ノード(CONTENT_UPROVIDER)6.空プロセス(EMPTYuAPP)
特徴:
1.プロセスの中にserviceと視覚的なactivityが同時に含まれるなら、このプロセスはserviceプロセスではなく可視プロセスに帰すべきです。
2.また、他のプロセスがそれに依存しているなら、プロセスのレベルを高めることができます。例えば、AプロセスのserviceはBプロセスのコンポーネントにバインドされています。プロセスAは常にBプロセスと同じくらい重要であると考えられます。
3.システム中のphoneサービスはセカンダリサービスではなくフロントプロセスに分けられます。
androidで進行するoom_adj値はその優先度を表している。
oom_adj値が高いほど、プロセスの優先度が低いことを表す。
adb shell cat/proc//oom_adjはあるプロセスの現在のoom_を調べます。adj値
プロセスoom_adj値の更新:
and roidプロセスのoom_adjはActivityManagerServiceで更新されます。
lowmemorykiller.cのlowmem_を参照してください。shrink関数は、どのプロセスが回収されるかを計算し、SIGKILL信号を送信します。
0,1,2,7,14,15
回収タイミング:
init.rc中:
上の6つの数字が対応しているのは(MB)です。6,8,16,20,22,24
現在の設定を確認してもいいです。
cat/sys/module/lowmemorykiller/parameters/minfree
この値を再設定するには(異なる需要に対応):
echo「1536,2048,4096,5120,153660,2340」>/sys/module/lowmemorykiller/parameters/minfree
このように、利用可能メモリが90 MB以下の場合には、空きプロセスが開始され、利用可能メモリが60 MB以下の場合には、コンテンツ供給ノードが終了する。
具体的な回収はActivityManagerService.javaの関数trimAppliations()で実現されます。
1.まず、Packageが移動された無駄なプロセスを削除します。
2.プロセスの現在の状態に基づいて、oom_を更新します。adj値は、次のように動作する。
activityが実行されていないプロセスを削除します。
APがすべてのactivity状態を保存した場合、このAPを終了する。
3.最後に、まだたくさんのactivitiesが運行しているなら、それらのactivity状態がすでに保存されているactivityを除去します。
システムメモリが不足しているときに、AndroidのLow Memory Killerは必要に応じて、そのメモリをリリースします。つまり、最適なプロセスを探して殺します。
最適:
•oom_adjが大きいほど
•物理メモリの占用が多い
LRUリストを表示します。Adb shell dumpsys activity
activitydemoがフロントにいる時:
Serviceを含むプロセスの優先度が高く、computeOom Adj Lockedにあります。
中将は2つの小分類に分類されます。
static final int MAX_SERVICE_INACT IVITY=30*60*1000;
if(now<(s.lastActivity+MAX){SERVICEClity}{
if(adj)SECONDARYUSERVERUADJ){
adj=SECONDARYUSERVERUADJ;
app.adjType=「started-services」
app.hidden=false
}
}
if(adj)SECONDARYUSERVERUADJ){
app.adjType=「started-bg-services」
}
)
完全にキルにプロセスをさせないのは不可能です。いくつかの操作を通じて、キルルにプロセスを小さくすることができます。
1プロセスの優先度を上げる:
バックグラウンド操作はService形式を採用しています。一つのプロセスは一つのバックグラウンドactivityを実行しているレベルより高いです。
2 backキーを押すと、プロセス中のactivityはdestoryではなくバックグラウンドで動作します。backボタンを再搭載する必要があります。
3他の優先度の高いプロセスに依存します。
プロセスの属性を強制的に変更します。
プログラムにset Persistent(true)を設定します。
projectのAndroid Manifest.xmlの「aplication」に属性androidを追加します。persistent=「true」
android:persistent(SDK)
Whether or not the appication shoud remand running at all times.The default value is「false」.Application s shound normally set this flags;persistence mode is inted only for certain system.system.system.systremation。
1.killProcess(int pid)を使って指定PIDのプロセスを殺すことができます。
public void onClick(View v)
android.os.Process.killProcess(android.os.Process.myPid);
)
System.exit(0)を使うと、同じ効果が得られます。
2.finishを使って、現在のactivityを殺すことができます。
1.資料を保存する:毎回ActivityでonPauseまたは
ワンストップ状態の時はまず資料を保存して、それからOCreateの時に資本金を使います。
生命周期の方法。
2.OnSaveInstance State(ライフサイクル以外の方法)
オンストリップInstance State
Androidのプロセスはホストであり、システムのプロセス空間が緊張している場合、優先順位に従って自動的にプロセスの回収を行います。
ここから三つの問題を持ってきました。
回収ルール: いつ回収しますか?どれを回収しますか?
誤殺を避ける: 回収を阻止するにはどうすればいいですか?
データの復元と保存: 回収されました。どうすればいいですか?
Androidはプロセスを6段階に分けて、優先順位は高い順から低い順に次のようになります。
1.フロントプロセス(FOREGROUND UAPP)2.テレビプロセス(VISIBLEuAPP)3.セカンダリサービスプロセス(SECONDARYUSERVER)4.バックグラウンドプロセス(HIDDEN_APP)5.コンテンツ供給ノード(CONTENT_UPROVIDER)6.空プロセス(EMPTYuAPP)
特徴:
1.プロセスの中にserviceと視覚的なactivityが同時に含まれるなら、このプロセスはserviceプロセスではなく可視プロセスに帰すべきです。
2.また、他のプロセスがそれに依存しているなら、プロセスのレベルを高めることができます。例えば、AプロセスのserviceはBプロセスのコンポーネントにバインドされています。プロセスAは常にBプロセスと同じくらい重要であると考えられます。
3.システム中のphoneサービスはセカンダリサービスではなくフロントプロセスに分けられます。
androidで進行するoom_adj値はその優先度を表している。
oom_adj値が高いほど、プロセスの優先度が低いことを表す。
adb shell cat/proc/
プロセスoom_adj値の更新:
and roidプロセスのoom_adjはActivityManagerServiceで更新されます。
updateOomAdjLocked() =>
int adj = computeOomAdjLocked(app, hiddenAdj, TOP_APP, false);
Process.setOomAdj(app.pid, adj) =>
android_os_Process_setOomAdj //android_util_Process.cpp
プロセス回収lowmemorykiller:lowmemorykiller.cのlowmem_を参照してください。shrink関数は、どのプロセスが回収されるかを計算し、SIGKILL信号を送信します。
if (selected) {
lowmem_print(1, "send sigkill to %d (%s), adj %d, size %d
",
selected->pid, selected->comm,
selected_oom_adj, selected_tasksize);
lowmem_deathpending = selected;
lowmem_deathpending_timeout = jiffies + HZ;
force_sig(SIGKILL, selected);
nr_samples--;
rem -= selected_tasksize;
}
oom_adjレベルはinit.rcに設定されています。# Define the memory thresholds at which the above process classes will
# be killed. These numbers are in pages (4k).
setprop ro.FOREGROUND_APP_ADJ 0
setprop ro.VISIBLE_APP_ADJ 1
setprop ro.SECONDARY_SERVER_ADJ 2
setprop ro.HIDDEN_APP_MIN_ADJ 7
setprop ro.CONTENT_PROVIDER_ADJ 14
setprop ro.EMPTY_APP_ADJ 15
init.rcでは、PIDを1とするプロセス(initプロセス)のoom_adj設定は-16: # Set init its forked children's oom_adj.
write /proc/1/oom_adj -16
本機の設定を確認します。cat/sys/module/lowmemorykiller/parameters/adj0,1,2,7,14,15
回収タイミング:
init.rc中:
# Write value must be consistent with the above properties.
# Note that the driver only supports 6 slots, so we have combined some of
# the classes into the same memory level; the associated processes of higher
# classes will still be killed first.
setprop ro.FOREGROUND_APP_MEM 1536
setprop ro.VISIBLE_APP_MEM 2048
setprop ro.SECONDARY_SERVER_MEM 4096
setprop ro.HIDDEN_APP_MEM 5120
setprop ro.CONTENT_PROVIDER_MEM 5632
setprop ro.EMPTY_APP_MEM 6144
これらの数字は対応するメモリのしきい値です。この値を下回ると、Androidは処理を順番にオフにします。これらの数字の単位はpageです。 1 page=4 kB.上の6つの数字が対応しているのは(MB)です。6,8,16,20,22,24
現在の設定を確認してもいいです。
cat/sys/module/lowmemorykiller/parameters/minfree
この値を再設定するには(異なる需要に対応):
echo「1536,2048,4096,5120,153660,2340」>/sys/module/lowmemorykiller/parameters/minfree
このように、利用可能メモリが90 MB以下の場合には、空きプロセスが開始され、利用可能メモリが60 MB以下の場合には、コンテンツ供給ノードが終了する。
具体的な回収はActivityManagerService.javaの関数trimAppliations()で実現されます。
1.まず、Packageが移動された無駄なプロセスを削除します。
2.プロセスの現在の状態に基づいて、oom_を更新します。adj値は、次のように動作する。
activityが実行されていないプロセスを削除します。
APがすべてのactivity状態を保存した場合、このAPを終了する。
3.最後に、まだたくさんのactivitiesが運行しているなら、それらのactivity状態がすでに保存されているactivityを除去します。
システムメモリが不足しているときに、AndroidのLow Memory Killerは必要に応じて、そのメモリをリリースします。つまり、最適なプロセスを探して殺します。
最適:
•oom_adjが大きいほど
•物理メモリの占用が多い
LRUリストを表示します。Adb shell dumpsys activity
activitydemoがフロントにいる時:
Serviceを含むプロセスの優先度が高く、computeOom Adj Lockedにあります。
中将は2つの小分類に分類されます。
static final int MAX_SERVICE_INACT IVITY=30*60*1000;
if(now<(s.lastActivity+MAX){SERVICEClity}{
if(adj)SECONDARYUSERVERUADJ){
adj=SECONDARYUSERVERUADJ;
app.adjType=「started-services」
app.hidden=false
}
}
if(adj)SECONDARYUSERVERUADJ){
app.adjType=「started-bg-services」
}
)
完全にキルにプロセスをさせないのは不可能です。いくつかの操作を通じて、キルルにプロセスを小さくすることができます。
1プロセスの優先度を上げる:
バックグラウンド操作はService形式を採用しています。一つのプロセスは一つのバックグラウンドactivityを実行しているレベルより高いです。
2 backキーを押すと、プロセス中のactivityはdestoryではなくバックグラウンドで動作します。backボタンを再搭載する必要があります。
3他の優先度の高いプロセスに依存します。
プロセスの属性を強制的に変更します。
プログラムにset Persistent(true)を設定します。
projectのAndroid Manifest.xmlの「aplication」に属性androidを追加します。persistent=「true」
android:persistent(SDK)
Whether or not the appication shoud remand running at all times.The default value is「false」.Application s shound normally set this flags;persistence mode is inted only for certain system.system.system.systremation。
1.killProcess(int pid)を使って指定PIDのプロセスを殺すことができます。
public void onClick(View v)
android.os.Process.killProcess(android.os.Process.myPid);
)
System.exit(0)を使うと、同じ効果が得られます。
2.finishを使って、現在のactivityを殺すことができます。
1.資料を保存する:毎回ActivityでonPauseまたは
ワンストップ状態の時はまず資料を保存して、それからOCreateの時に資本金を使います。
生命周期の方法。
2.OnSaveInstance State(ライフサイクル以外の方法)
オンストリップInstance State