合計 昨日 今日

アバター
Dixq (管理人)
管理人
 
記事: 1559
登録日時: 2010年10月12日(火) 20:16
お住まい: 北海道札幌市
日記: 日記を見る (573)
日記
- 12月 2017
Amazonに載った (0)
   2017年12月17日(日) 12:33
AmazonTVアプリ作って申請してみた (0)
   2017年12月16日(土) 21:35
【悲報】お小遣い瀕死 (6)
   2017年12月16日(土) 03:07
ボーナスで自社製品を買う (2)
   2017年12月10日(日) 20:17
玉藤製と自宅製 (9)
   2017年12月03日(日) 22:01

+ 11月 2017
+ 10月 2017
+ 9月 2017
+ 8月 2017
+ 7月 2017
+ 6月 2017
+ 5月 2017
+ 4月 2017
+ 3月 2017
+ 2月 2017
+ 1月 2017
+ 12月 2016
+ 11月 2016
+ 10月 2016
+ 9月 2016
+ 8月 2016
+ 7月 2016
+ 6月 2016
+ 5月 2016
+ 4月 2016
+ 3月 2016
+ 2月 2016
+ 1月 2016
+ 12月 2015
+ 11月 2015
+ 10月 2015
+ 9月 2015
+ 8月 2015
+ 7月 2015
+ 6月 2015
+ 5月 2015
+ 4月 2015
+ 3月 2015
+ 2月 2015
+ 1月 2015
+ 12月 2014
+ 11月 2014
+ 10月 2014
+ 9月 2014
+ 8月 2014
+ 7月 2014
+ 6月 2014
+ 5月 2014
+ 4月 2014
+ 3月 2014
+ 2月 2014
+ 1月 2014
+ 12月 2013
+ 11月 2013
+ 10月 2013
+ 9月 2013
+ 8月 2013
+ 7月 2013
+ 6月 2013
+ 5月 2013
+ 4月 2013
+ 3月 2013
+ 2月 2013
+ 1月 2013
+ 12月 2012
+ 11月 2012
+ 10月 2012
+ 9月 2012
+ 8月 2012
+ 7月 2012
+ 6月 2012
+ 5月 2012
+ 4月 2012
+ 3月 2012
+ 2月 2012
+ 1月 2012
+ 12月 2011
+ 11月 2011
+ 10月 2011
+ 9月 2011
+ 8月 2011
+ 7月 2011
+ 6月 2011
+ 5月 2011
+ 4月 2011
+ 3月 2011
+ 2月 2011
+ 1月 2011
+ 12月 2010
+ 11月 2010
+ 10月 2010
フォロー
カテゴリー
日常
1 記事

誰か教えてくださいorz

パーマリンクby Dixq (管理人) on 2013年7月25日(木) 21:10

管理人が掲示板で質問するわけにいかないので、ここでひっそり質問を・・・。

Androidの1つのアプリが使用可能なメモリ量っていくらなんでしょう。

私の理解ではメモリに「Dalvikヒープ」と「Nativeヒープ」が存在し(合わせたヒープを仮にアプリヒープと呼ぶ)、その合計(アプリヒープ)が一定の量を超えてはならないと思っています。
つまりあるメモリ量をDalvikヒープとNativeヒープが分け合っている状態です。

Android2.3系で、Dalvikヒープをある程度使用した状態で、ByteBuffer.allocateDirect()を繰り返してNativeヒープを消費し続けたところ

画像(←ここで落ちる)

確かにDalvikヒープとNativeヒープの合計がmaxを超えるところでOutOfMemoryが発生します。
maxと言っても、ここで表示しているmaxは
Runtime.getRuntime().maxMemory()
の値です。
つまりDalvikヒープの最大量だと思われます。。。。じゃアプリ最大ヒープ量はいくらなの・・? =Dalvik最大ヒープ量?

もう一つ疑問があります。
Nativeを今度はallocateDirectではなく、実際にndkでCを使ってmallocし続けたところ

画像

今度はmaxを超えて確保し続けても落ちることがありません。恐らくLinuxヒープを使っているのかいくらでも確保できます。
じゃここに表示されているNativeヒープ(Debug.getNativeHeapSize())は何?

結局1つのアプリでいくらメモリが使えるのかよく分からんとです・・・。

テストに使ったアプリのソースコードをここにアップします。
http://dixq.net/blog/13.07.25/memorytest.zip
最後に編集したユーザー Dixq (管理人) [ 2013年7月25日(木) 21:14 ], 累計 2 回

コメント数: 6 閲覧数: 22549
コメント

Re: 誰か教えてくださいorz

パーマリンクby ISLe on 2013年7月26日(金) 00:38

リファレンスによるとByteBuffer#allocateはバッファをバイト配列として確保、ByteBuffer#allocateDirectはメモリブロックとして確保するとあります。
Javaの配列はオブジェクトなので前者は配列のオーバーヘッドを含めた実装になっていると思われます。
後者はC/C++のように連続したメモリブロックを一括で確保してアクセスする低レベルな実装になっていると思われます。

ByteBuffer.allocateDirectは実装上の都合でNativeヒープからメモリブロックを確保しているのではないかと思います。
しかしVM上のプロセスとしては全体で最大消費可能メモリを超えないように実装されているのではないでしょうか。

NDKはVM上のプロセスとしてではなく、VM自身のプロセスから制限なしにヒープを消費していくことになると思います。
APIからNativeヒープサイズとして取得できる値を超えて確保すると、VM自体の動作に支障をきたす恐れがあるのではないでしょうか。

OutOfMemory例外が発生しない範囲で確保するのが無難ではないかと思います。
最後に編集したユーザー ISLe [ 2013年7月26日(金) 00:43 ], 累計 2 回
ISLe
 
記事: 2593
登録日時: 2010年10月16日(土) 22:47
日記: 日記を見る (19)

Re: 誰か教えてくださいorz

パーマリンクby Dixq (管理人) on 2013年7月27日(土) 15:41

> ISLeさん

そうなのでしょうね~。
しかし「アプリが使えるメモリは後いくらなのか」という情報はどうしたら取得できるんでしょう・・。
今私がしたいのは、メモリが少なくなってきたら、蓄えているバッファを少しずつ解放するということです。
同じNativeヒープでも中身が異なるのであれば計算のしようが無いですね・・・。
アバター
Dixq (管理人)
管理人
 
記事: 1559
登録日時: 2010年10月12日(火) 20:16
お住まい: 北海道札幌市
日記: 日記を見る (573)

Re: 誰か教えてくださいorz

パーマリンクby ISLe on 2013年7月27日(土) 16:49

アプリが使えるメモリというのは、
Dixq (管理人) さんが書きました:確かにDalvikヒープとNativeヒープの合計がmaxを超えるところでOutOfMemoryが発生します。

というところから逆算できるのではないでしょうか。

それ以上のメモリ確保は、優先度の低いアプリを強制終了するとかメモリ掃除とかを目的とするようなシステムレベルの話になるでしょう。
OSやVMの動作を把握しないと安定動作は難しいかと。
ソースコードは公開されているのでできないことはないですけどバージョンアップ対応とか面倒なことがたくさん付いてくると思います。
ISLe
 
記事: 2593
登録日時: 2010年10月16日(土) 22:47
日記: 日記を見る (19)

Re: 誰か教えてくださいorz

パーマリンクby Dixq (管理人) on 2013年7月27日(土) 20:02

上に書いている通り、
Javaから取ったNativeヒープ①と、NDKから取ったNativeヒープ②では同じNativeヒープでも訳が違うようで、
DalvikヒープとNativeヒープの合計が①の場合落ち、②の場合落ちません。
ですから①と②が混在している時はいつ落ちるか予測が付きません・・ということで困っています。

最近の端末は非常にメモリが潤沢ですから、32MBのような壁は越えて使いたいものです。
アバター
Dixq (管理人)
管理人
 
記事: 1559
登録日時: 2010年10月12日(火) 20:16
お住まい: 北海道札幌市
日記: 日記を見る (573)

Re: 誰か教えてくださいorz

パーマリンクby ISLe on 2013年7月27日(土) 21:41

ByteBuffer#allocateDirectはNativeヒープを確保するもVMを通してますから、VMがランタイムメモリの消費量として加算していて例外が発生するのでしょう。
ネイティブコードはVM通さないので例外が発生しない、それだけの違いかと思います。

でネイティブコードでどれだけのメモリを確保可能かという話であればシステムコールを使えば良いのではないでしょうか。
と思って調べてみたのですがAndroidはどうなのかわかりませんが、Linuxは楽観的メモリ配置戦略を用いていて確保するだけならいくらでも確保できるそうです。
アクセスしてみてメモリ不足なら落ちるという具合。
物理メモリの使用状況は/proc/meminfoにアクセスして読み取るしかないみたいですが、こちらもAndroidで通用するか不明。
ISLe
 
記事: 2593
登録日時: 2010年10月16日(土) 22:47
日記: 日記を見る (19)

Re: 誰か教えてくださいorz

パーマリンクby Dixq (管理人) on 2013年7月27日(土) 22:17

私が知りたいのは要するに以下のようなものです。

今の瞬間Nativeヒープの使用量が32MBである。
この時、VMを通した消費メモリとVMを通していない消費メモリサイズはそれぞれいくらなのか?

こんな感じです。
そうすれば後いくら使えるかが明確にわかりそうです。
アバター
Dixq (管理人)
管理人
 
記事: 1559
登録日時: 2010年10月12日(火) 20:16
お住まい: 北海道札幌市
日記: 日記を見る (573)

オンラインデータ

登録ユーザー: a5ua, みけCAT