ただただメモリを浪費するアプリ、「MemFat」を作ってみた
https://gitlab.com/TranslucentFoxHuman/memfat
こちらにて、ただただメモリを消費するだけのアプリ、MemFatを公開しています。
正直、意味あるのか? って思ったと思います。大丈夫です。ちゃんと意味があって作ってます(笑)
開発のきっかけ
Android使ってて、時々メモリ不足に遭遇してマルチタスクが厳しくなることがあると思います。
特にキャリアスマホ&国産メーカーの場合、要らんキャリアアプリが大量に入ってて消さないとどんどんメモリを食いつぶされます。かと言って、全部消すのも面倒…
僕の場合、Twitter開きながらFirefoxでウェブ閲覧し、Kritaでお絵描きしたらメモリ不足に陥りました。
それで、メモリ解放アプリがほしいなとは思ったのですが、F-Droidには掲載されておらず、Google Playストアにもプロプライエタリなものしかなく、オープンソースソフトウェアはありませんでした。
ということで、作ってしまおうと。
では、Androidがどうやってリソース不足時にリソースを確保するか見ていきましょう
Androidのメモリ解放
Androidがリソース不足に陥った時、Androidは使用されていない不要なタスクを終了させることで足りないリソースを確保します。
アプリをたくさん開きすぎた時、しばらく使ってないアプリがいつの間にか終了されていて、履歴から開くとはじめから起動してしまうのはこのせいです。
これを逆手に取って、あえて無駄にメモリを消費することでリソース不足状態に陥れ、ほかのプロセスを終了させてしまうのです。
これにより、Root権限やadbなどによる特別な操作無しで意図も簡単にメモリクリーナーもどきができるわけです。
てことで作ったMemFat
ということで、無理やりメモリを浪費してメモリ解放を行うMemFatの開発に取り掛かりました。
構造は至って単純で、ボタンが押されたら、ヒープメモリを指定された量分確保して、その領域全体に1を書き込むだけです。
実験段階では、ヒープ領域を確保しただけではメモリは消費されませんでした。あくまで確保のときはただアドレスを確保するだけみたいですね。ということで、ためしに確保したヒープを1で埋め尽くした所、実際にメモリが消費されました。
それで完成したアプリを実際にAndroid上で実行すると…
無事にメモリを確保、何度も確保していくうちにメモリ使用率が急降下し、実際に他のプロセスが終了されて空きメモリが確保されたことを確認できました。
実行前
1GBだけ消費してみた後
メモリ使用率が跳ね上がってます。
MemFatが落ちるまで何度も繰り返し実行した後。
メモリ使用率は実行前の54%から遥かに下がって37%にまで落ちています。
モニターのログがはじめからになっていることから、モニターアプリすらリソース確保のために強制終了されたことがわかります。
こんな感じで、半ば無理やりメモリを開放させることに成功しました。
調べてみたら、他のPlayストアとかにもあるクリーナーも同じ仕組みを採用しているようですね。
細かい所のお話
実を言うと、メモリを確保した後はdelete[]してません。つまり、一旦確保したら確保された領域は放棄されないんです。
確保されたメモリの開放に関しては、完全にOS側に依存してるんですよね。
まあ、ご安心を。このアプリを終了すれば勝手に開放されますんで。永遠にメモリが食いつぶされるとかそういったことは一切ございません。
なんでdelete[]しないかって言うと、単純明快な理由で、「面倒くさいから」です。
delete[]したら、確保されたメモリ全部が開放されるのかと思いきや、最後に確保した分しか開放されないみたいなんですね。
「Got fat!!」を連打してたくさんメモリを確保した場合、確保したメモリ全部を開放することが出来なかったんです。
で、全部開放されるよう処理組むのがめんどくさかったので、メモリ解放はOSにおまかせしました。
まともにこのへんまで作ってる暇があったらお絵描きしたほうがよっぽど有意義ですわ(笑)
文句があれば、GPL 3の自由ソフトウェアですからお好きなように改造して使ってください(笑)
ちなみに、このソフトウェアはQtとC++で書かれてます。
なんで普通にAndroid Studioとか使わないのかって言ったら、これもまためんどくさかったからです。
Qtなら、特に何も考えなくても勝手にC++ネイティブコード埋め込めますし、というかそもそも、Android Studioとかで作るなら、JavaとかKotlin学び直すのめんどくさかったんですよね。UI設計も違うし…
慣れたC++で直接書きたかったんでQtとC++で作りました。