Android Monitor在我的应用程序中向我显示了一个恒定的内存增量

时间:2016-04-18 02:12:13

标签: android memory-management memory-leaks android-camera surfaceview

我正在使用Android的应用程序,我正在使用Surface来读取QR码。使用Monitor检查资源我看到内存的常量增量从~7 MB到~20 MB,然后内存被释放并且行为重新开始。我想知道这是不正常还是我错过了什么。

我的代码

public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback {

    TextView barCodeInfo;
    SurfaceView cameraSurface;
    Button scan;

    BarcodeDetector barcodeDetector;
    CameraSource cameraSource;

    static final int REQUEST_CAMERA_PERMISSION = 1001;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        cameraSurface = (SurfaceView) findViewById(R.id.cameraSurface);
        barCodeInfo = (TextView) findViewById(R.id.barCodeResult);
        scan = (Button) findViewById(R.id.scan);

        scan.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
            if (ActivityCompat.checkSelfPermission(MainActivity.this,
                    Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {

                ActivityCompat.requestPermissions(MainActivity.this,
                        new String[]{Manifest.permission.CAMERA}, REQUEST_CAMERA_PERMISSION);
            } else {
                showCameraPreview();
            }
            }
        });

        barcodeDetector = new BarcodeDetector.Builder(this)
                .setBarcodeFormats(Barcode.QR_CODE)
                .build();

        barcodeDetector.setProcessor(new Detector.Processor<Barcode>() {
            @Override
            public void release() {
            }

            @Override
            public void receiveDetections(Detector.Detections<Barcode> detections) {
                final SparseArray<Barcode> barCodes = detections.getDetectedItems();
                if (barCodes.size() != 0) {
                    barCodeInfo.post(new Runnable() {    // Use the post method of the TextView
                        public void run() {
                            barCodeInfo.setText(    // Update the TextView
                                    barCodes.valueAt(0).displayValue
                            );
                        }
                    });
                }
            }
        });

        cameraSource = new CameraSource.Builder(this, barcodeDetector)
                .setRequestedPreviewSize(200, 200)
                .build();

        cameraSurface.getHolder().addCallback(this);
    }

    private void showCameraPreview() {
        try {
            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) {
                cameraSource.start(cameraSurface.getHolder());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {

    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        if(cameraSurface != null){
            cameraSurface = null;
        }
    }


    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            showCameraPreview();
        } else {
            Toast.makeText(this, "Camera permission was denied", Toast.LENGTH_LONG).show();
        }
    }
}

Android Monitor

enter image description here

仅在关闭应用程序时才恢复内存。

1 个答案:

答案 0 :(得分:2)

是的,这是完全正常的。在应用程序运行过程中,资源在内存中分配,因此内存使用量增加(如android监视器所示)。系统继续检查空闲内存以启动垃圾收集器以释放任何未引用的内存。

BTW,JVM不会运行垃圾收集器,因为垃圾收集会使事情慢下来,因此不应该非常频繁地运行。它在需要内存被释放时运行。始终最好尽可能延迟GC。

在下图中,突然释放内存是由于GC事件造成的。

enter image description here

很高兴看到没有太多的GC事件,因为这会降低应用程序的性能。

因此,如果您继续使用您的应用程序并且内存占用量不断增加,那么GC会不时地释放它们。