私のAndroidアプリでは、DoubleBuffer
オブジェクトに格納されたデータの処理を行うスレッドにループがあります。驚いたことに、put(DoubleBuffer)
はメモリを割り当てているようです!DoubleBuffer.put()がメモリを割り当てているのはなぜですか?これを避けるにはどうすればよいですか?
これは私が期待していたはずのものですか?私には、NIOバッファについて理解していると思ったことすべてに反するようです。それを避けるために何かしなければならないことはありますか?
ループ内の2つのバッファ間を単純にコピーする最小限の例でこれを再現できます。私はこれが起こらない、put()
への呼び出しをコメントアウトした場合
D/dalvikvm: GC_FOR_ALLOC freed 2032K, 55% free 6556K/14500K, paused 11ms, total 11ms
:アンドロイド4.4.2を実行している物理的な電話でのAndroidメーカー経由で実行、ログは次のような行で満たされています。
ここで「空のアクティビティ」テンプレートの上に書かれた私は、この問題を再現コード、です:
public class MainActivity extends AppCompatActivity {
private Thread thread;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
protected void onStart() {
super.onStart();
thread = new Thread(new Runnable() {
@Override
public void run() {
DoubleBuffer buffer1 = DoubleBuffer.allocate(5000);
DoubleBuffer buffer2 = DoubleBuffer.allocate(buffer1.capacity());
while (!Thread.interrupted()) {
// set remaining to capacity so that entire buffer is copied
buffer1.clear();
buffer2.clear();
buffer2.put(buffer1);
Thread.yield();
}
}
});
thread.setDaemon(true);
thread.start();
}
@Override
protected void onStop() {
if (thread != null) {
thread.interrupt();
thread = null;
}
super.onStop();
}
}
そして、ここではapp/build.gradle
の関連部分です:
apply plugin: 'com.android.application'
android {
compileSdkVersion 25
buildToolsVersion "25.0.2"
defaultConfig {
minSdkVersion 10
targetSdkVersion 25
}
}
dependencies {
compile 'com.android.support:appcompat-v7:25.1.0'
}
コードは無意味です。空のバッファを別のバッファに置くと、データは転送されません。何かを試してみてください。 – EJP
@EJP 'buffer.clear()。remaining()== buffer.capacity()'であるため、バッファ全体を転送する必要があります。テストはメモリ使用量のため、私は偽のテストデータを生成しませんでした。 –