Serviceを読んで理解し、同意したものとみなします。スタック・オーバーフローはプログラマーとプログラミングに熱心な人のためのQ&Aサイトです。1,163件1InputStreamをStringに変換しようとするとOutOfMemoryErrorが発生します。変換しようとしているInputStreamはAndroidのプロジェクトのrawフォルダの中にあるバイナリファイル(5.5MB)を次のようにInputStreamに変換したものです。this.getRawResouces().openRawResouce();メモリが876MBの環境でテストしています。StudioでMemoryの様子を見てみました。一応画像貼っておきます。へこんでいるところがInputStreamを変換したところです。解決を早めるために、別サイトにも投稿させて頂きました。個の銅バッジストリームの入力になっているテキストサイズははどの程度でしょうか?またInputStreamは適切にclose()されていますか?入力がネットワークからであれば、コネクション周りのclose()忘れの可能性を考慮に入れるといいと思います。3:24初歩的な質問で申し訳ないですがバイナリファイルのテキストサイズってどうやって確認するのでしょうか(外部からダウンロードしたものを使っているため分からない)。ファイルサイズなら、5.5MBみたいです。4:23ファイルサイズが大きく見積もっても6MB程度という情報があれば大丈夫です。メモリが876MBとのことですが、実際の各アプリケーションに割り当てられるJavaヒープはもっと少ないです。6MBでOoMが起きるかというと微妙なので、リソースリーク(close()しているかどうか)を疑うか、ヒープダンプして調査するかっていう感じじゃないでしょうか。最終手段でlargeHeap。いずれにしても、このコード自体を見ても、原因はわからなさそうです。6:11ヒープはAndroidなんでどんくらい割り当てられているのかわかりませんし、ヒープを沢山割り当てるのも出来ません。後close()もしています。6:37Androidが各アプリに割り当てるJavaヒープの量はRuntime.getRuntime().maxMemory()で知ることができます(もしJavaヒープとNativeヒープについてご存知でなければ調べてみてください)。AndroidStudio1.5からはメモリプロファイラが強化されていますので、そちらを利用方法を調べてみてください。最後に、「エラーが発生しない」とされているコードは、lineが固定値0なのでそもそもストリームから読み込んだデータを利用していません。sb.append(b);に修正する必要があります。票1もし5.5MBのサイズのファイルのすべての文字列が一行としてreadLineで読み込まれるのだとしたら、まずb:Stringにはおそらく11MBのヒープ確保が必要になります。ここらへん)仮に22MBそこで必要になっているのだとしたら、上の画像にある75MBから空白Heap含めた約95MBを上回ってしまっているのでは?という仮定はできると思います。上記の画像では落ちてないっぽいので、この仮定の前提が違う気がしますけど。※というか画像のonResumeにsleep書いてるのやばい気がしますけど...。他に何かあるだろうという気がしてきますね...。個の銅バッジコードをみました。この場合でももし5.5MBのファイル読み込みをして入っているデータをString型に置き換えようとしているなら、最低でもヒープサイズが11MBは必要になるということには変わりないです。それはOOMを起こす可能性があります。今回の問題は、他の処理で大量にヒープが消費されている状態で、この処理を呼び出すことでトドメを刺していることではないかと考えます。変数のスコープの確認、不要になったデータへの参照を開放、メモリリークの改善などを行い、できるだけヒープをミニマムになるようにし、全体としてメモリ効率が高くすることが解決策の様に思います。18:00分かりました。思い当たるところは直します。バイナリデータを文字列に変換するのは無理です。文字列に変換すると、1バイトのバイナリデータがで2、3バイト程の文字と認識される場合があり、二倍、三倍くらいのヒープが消費されるためです。272shin16さんが言うには最低でもヒープサイズが11MBは必要になるということには変わりないです。teratailでもバイナリデータを無理やり文字に変換しようとしていますから、1バイトのバイナリデータが2バイトの文字に変換される場合があり、最悪2倍のメモリを消費する結果となっているのではないかと思われます。これでは空白ヒープを上回り、最終的にはOoMが発生という流れでしょう。|0readlineがいけないのかもしれません。別方法のread等を使ってみてください。readlineの対象の1行が巨大だった場合、読込時に連続した領域を確保できなくてOOMが発生している可能性が考えられます。|回答スタック・オーバーフローに参加してくれて、ありがとうございます!質問の回答を共有してください。回答を説明し、自分の検討結果も共有してください。意見を述べること(意見を述べるなら、参照リソース、自分の経験で意見をサポートしてください)さらにサポートが必要な場合このヘルプを参考してください。“回答を投稿”をクリックすることで利用規約、プライバシーポリシー、及びクッキーポリシーに同意したものとみなされます。タグが付いた他の質問を参照するか、自分で質問をする。呼ばれることはありますか1Androidアプリで自分の位置情報を地図に反映したい3androidのアプリでBookmarkを取得したい0Javaからmysqlコマンドを実行し、結果をファイルに書き出したい。質問のフィードこのRSSフィードを購読するには、このURLをコピーしてRSSリーダーに貼り付けてください。