非常に奇妙な問題に遭遇しました。以下のコードの一部を書いています。
try {
while (!stopCapture) {
// Read data from the internal buffer of the data line.
int cnt = this.recLine.read(tempBuffer, 0, tempBuffer.length);
if (cnt > 0) {
// Save data in output stream object.
byteArrayOutputStream.write(tempBuffer, 0, cnt);
// System.out.println(" bytes " + tempBuffer[0]);
}// end if
}// ends while
// AudioSystem.write(myAIS, targetType, outputFile);
byteToWave(byteArrayOutputStream);
byteArrayOutputStream.close();
} catch (IOException e) {
// TODO provide runtime exception to reach it to presentation layer
e.printStackTrace();
} catch (Exception ex) {
ex.printStackTrace();
}
recLine は、サウンドを byteArrayOutputStream に録音している TargetDataLine です。私のテストでは40〜48秒までは正常に動作しますが、49秒に達するたびに以下の例外がスローされます:
Exception in thread "Thread-5" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:2786)
at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:94)
at com.actura.app.capture.ActuraRecorder.run(ActuraRecorder.java:109)
at java.lang.Thread.run(Thread.java:619)
記録されたバイトが必要であり、それらのバイトから UI で波形を正常に描画しているため、この手法を使用しています。
テスト中に、byteArrayOutputStream のサイズがわずか 7.3 MB の場合に例外が発生することがわかりました。
この byteArrayOutputStream をランダム アクセス ファイルに書き込み、制限に達するたびにこの byteArrayOutputStream をリセットできますか?
byteArrayOutputStream の制限を事前に知るにはどうすればよいですか?
Integer.MAX_VALUE で確認しましたが、7.3 mb で例外が発生したため、Integer.MAX_VALUE に到達できませんでした。
このアプレットはインターネット上で実行されるため、メモリ サイズを設定しても役に立ちません。クライアントのコンピュータに設定するにはどうすればよいですか?