Android Monitor 显示我的应用程序内存不断增加

标签 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 监视器

enter image description here

只有当我关闭应用程序时,内存才会恢复。

最佳答案

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

顺便说一句,JVM 在必要时不会运行垃圾收集器,因为垃圾收集会大大减慢速度,因此不应频繁运行。当需要内存被释放时它就会运行。尽可能延迟 GC 始终是首选。

下图中,由于GC事件导致内存突然释放。

enter image description here

看到没有太多 GC 事件是件好事,因为这会降低应用性能。

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

关于Android Monitor 显示我的应用程序内存不断增加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36684435/

相关文章:

android - 如何为Android实现BottomAppBar?

android - 是否可以检查应用程序在后台运行了多长时间?

c++ - 在 C++ 中释放指针两次或更多次时会发生什么?

c - malloc() 在 free() 之后重用内存位置,导致碎片化(?)

c++ - 在 C++11 中释放动态分配的 uv_timer_t (libuv) 实例

android - Stripe 结帐不适用于 WebView

javascript - Chrome 浏览器中的 JS 弹出窗口和 Android 中的 Webchrome 客户端的不同行为

c - 发生故障时释放所有分配的内存

Android JNI - 如何正确释放在 C native 函数中分配的内存

java - 如何验证Java中的内存泄漏