質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

1回答

2691閲覧

1秒の動画を450本撮影した後に、too many open files エラーが出ます。

giant

総合スコア132

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

1クリップ

投稿2017/10/24 03:48

動画撮影をしていて、撮影ファイル数が450本になったところでエラーが出ます。

対策としては

java

1 private void closePreviewSession() { 2 3 if(mPreviewBuilder!=null) { 4 mPreviewBuilder.removeTarget(previewSurface); 5 mPreviewBuilder = null; 6 previewSurface.release(); 7 previewSurface = null; 8 } 9 10 if(mPreviewSession!=null) { 11 try { 12 mPreviewSession.stopRepeating(); 13 mPreviewSession.abortCaptures(); 14 } catch (CameraAccessException e) { 15 e.printStackTrace(); 16 } 17 18 } 19 20 21 if (mPreviewSession != null) { 22 mPreviewSession.close(); 23 mPreviewSession = null; 24 } 25 }

java

1 private void closeCamera() { 2 try { 3 mCameraOpenCloseLock.acquire(); 4 5 if (null != mCameraDevice) { 6 mCameraDevice.close(); 7 mCameraDevice = null; 8 } 9 if (null != mMediaRecorder) { 10 11 Log.e(TAG,"test now Release"); 12 mMediaRecorder.release(); 13 mMediaRecorder = null; 14 } 15 } catch (InterruptedException e) { 16 throw new RuntimeException("Interrupted while trying to lock camera closing."); 17 } finally { 18 mCameraOpenCloseLock.release(); 19 } 20 }

これら上記の2つのメソッドを、動画の撮影フォルダの変更のつどつど呼び出しています。
しかし、450本の動画を取った後に、too many open files エラーが出ます。

エラーは調べつくしました。実験は50回はやっています。全て445回から453回以内に同じエラーが怒っています。どうぞよろしくお願いします。

自分の中では、原因はCGが呼ばれていないのかと思っています。ただnullをセットしているのでなぜ呼ばれないかが疑問です。

イメージ説明

イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yohhoy

2017/10/26 06:16

https://developer.android.com/reference/java/lang/System.html#gc() Android/JavaでもGCをリクエストする(強制ではない)ことはできます。ただし、ファイルデスクリプタ(=内部リソース)の不足が起きていますから、GCが起きないというよりも参照が残っているなどのリソースリークを疑ったほうが良いかもしれません。
giant

2017/10/27 10:32

ありがとうございます。気づくのが遅くなり申し訳ありません。調べてみます。
guest

回答1

0

ベストアンサー

エラーメッセージの内容からAndroidOS側で開けるファイル数(ファイルディスクリプタ)の上限に達し、エラーが発生したと思われます。

GCではファイルディスクリプタを回収することはできませんので、ファイルを使い終わった時にreleaseなどの開放用のメソッドを明示的に呼び出さないとリソースリークの原因になります。
質問に明記されているリソース開放用の関数の呼び出し忘れがないか、finallyの中など実行が保証されている場所でリソースの開放処理をしているかなどを確認してください。
また、当該プログラムは大量にファイルを開く処理を行っているので、実行中にディスクリプタが溜まってクラッシュしている可能性も考えられます。
書き込み(録画)が終わったファイルはこまめに閉じるように心がけてください。

Javaには一応finalizeというオブジェクトがGCに回収される時に呼び出される関数が存在しますがあくまでも保険的なものです。Javaの仕様上は呼び出される事が保証されていませんのでご注意ください。

投稿2017/10/26 10:41

編集2017/10/26 11:32
yos-32

総合スコア15

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

giant

2017/10/27 02:27

本当にありがとうございます。アドバイスいただいたことは全て試します。 テストを行い結果報告をします。ありがとうございました。
giant

2017/10/27 10:17 編集

``` File filePath = new File(getVideoFilePath2()); File[] files = filePath.listFiles(); //ここでfilePathをリリースする filePath.delete(); ``` このようにしたのですが、too many open filesが出ました。 deleteではファイルディスクリプタを回収することはできないのでしょうか?
yos-32

2017/10/28 04:48

Fileクラス自体はファイルを開かないのでファイルディスクリプタを消費しないかと。 File.delete()を呼び出すとディスクリプタを閉じるのではなく、ファイル自体が削除されてしまいます。 おそらくMediaRecorderがファイルディスクリプタを使うので1ファイルの撮影が終わるごとにMediaRecorder.stop()とMediaRecorder.reset()は呼び出していますでしょうか?
giant

2017/10/28 05:15

返信をいただきまして、ありがとうございます。 stop()は呼び出しているのですが、reset()は呼び出さないで、 mMediaRecorder = new MediaRecorder(); 、 start() 、 stop() 、 release() 、 MediaRecorder = null のようなサイクルで回していました。 元々はresetを使っていたのですが、顔認証をするにはcameraを再生成しないといけなかったのでこのような方法をとりました。
giant

2017/11/01 05:08

HandlerThreadをnew して消す処理をしていなかったのでエラーが起きていました。ありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問