[課題] Low Memory Killer を意図的に発生させたい
Androidには、ヒープが涸渇すると使われていないアプリをKillする機能があります。
この記事では、意図的にヒープを枯渇させて、この状態をつくる方法について説明します。
単純にヒープを大量に消費するアプリを作成すれば良いように思えます。
しかし、これだけでは上手くいきません。
-A ひとつのアプリで消費できるヒープが制限されているため、ひとつのアプリで端末のヒープが涸渇している状態をつくれない。
-B ヒープを涸渇しているアプリがPFにKILLされる場合がある。
といった問題があります。
KyoroStressV2での解決方法を紹介します。
[KyoroStressでの解決方法]
Kyoro Stress では、以下のような方法をとりました。
- 1. 複数のServiceを、各々異なるプロセスで起動する。
- 2. 各々Serviceで大量のヒープを消費する。
複数のプロセスを立ち上げれば、PFのヒープを枯渇させることができます。これで、(A)の問題が解決できました。
また、Bについては、「生きているプロセス」が「KILLされたプロセス」の分もヒープを消費すれば上手くいけそうです。
[BigEater(ヒープ消費サービス)の動作]
KyoroStressV2で、ヒープを消費するサービスは以下のシナリオで動作しています。
- 1. 指定されたヒープを取得する。
is retry が true の時、指定されたヒープを取得できるまで、1を何度も繰り返す。
- 2. KILLされたサービスを復活させる。
is retry が true の時、Threadが死ぬまで、何度も2を繰り返す。
- 3. 終了
といった感じです。
このままでは、すべてのServiceがPFにKILLされたら上手くいかないように思うかも知れません。
しかし、時間がたつと(数秒)、PFはKILLしたServiceを再起動します。
このため、ServiceがすべてKILLされても、ヒープを大量に消費しようとする状態は保持されます。
[使い方]
KyoroStressV2の操作方法について説明します。
# start
ヒープの消費を開始します。
ヒープの消費率監視を開始する。
# stop
ヒープの消費を終了する。そして、開放する。
# num of big eater
起動するプロセスの数
# eatup java heap size
ひとつのプロセスが消費するヒープサイズ
# is retry
オンならば、ヒープを確保できるまで、何度もトライする。
# show notification
オンならば、Notificaiotn表示をする。
# lowMoemory
true ならば、 ロウメモリー状態
# availMemory
使用可能なメモリ
# threshold
この値よりも低い場合は、ロウメモリー状態
# dalvik.vm.heapsize
ひとつのプロセスがandroid:largeHeap="true"の時に使用可能なJavaヒープ
# dalvik.vm.heapgrowthlimit
android:largeHeap="false"の時に使用可能なJavaヒープ
# lahalito
指定されたヒープを取得しにいっている状態
# kadorto
PFのKILLされたサービスを再起動させようとしている状態
# done all task
Serviceはすべての作業を完了した。そのため、もう何もすることはない状態
[成果物]
以下の場所にソースとAPKがあります。
https://github.com/kyorohiro/KyoroStressV2
Google Playでも公開しています。
https://play.google.com/store/apps/details?id=info.kyorohiro.helloworld.stressv2
[次回]
より、詳細な仕組みは別の記事で解説します。
- Serviceごとに、別プロセスにする方法は?
- アプリが使用可能なヒープを調べる方法は?
- Low Memory 状態を取得する方法は?
- 制限を越えてヒープを取得する方法?
-------
kyorohiro work
kyorohiro.strikingly.com
2013年2月17日日曜日
KyoroStressの技術 -1- Low Memory Killer を意図的に発生させたい
登録:
コメントの投稿 (Atom)
mbedtls dart の 開発を始めた web wasm ffi io flutter
C言語 で開発した機能を、Dart をターゲットとして、Web でも サーバーでも、そして Flutter でも使えるようにしたい。 そこで、mbedtls の 暗号化の部分を Dart 向けのPackageを作りながら、 実現方法を試行錯誤する事にした。 dart...
-
[課題] Low Memory Killer を意図的に発生させたい Androidには、ヒープが涸渇すると使われていないアプリをKillする機能があります。 この記事では、意図的にヒープを枯渇させて、この状態をつくる方法について説明します。 単純にヒープを大...
-
Dart の Native Extensions を利用して、 SDL を用いたマルチプラットフォームのゲーム開発環境を作れるか検証してみた。 結論からいくと、 「Mac 上で動作する SDL x Dart の アプリは動作させることが難しいよ」 と言うことです。 Wind...
-
Emscripten と OpenGLを使ってゲームを作ろうと思いたって、 まずは、SDL2の基本的な使い方を試していた。 しかし、今の所は、SDL 1系 の方が、良いと思いました。 SDL2があるのに、SDL1 を選ぶのはなぜか? # 201...
0 件のコメント:
コメントを投稿