如何减少GC_CONCURRENT操作?

时间:2015-10-06 19:59:31

标签: android android-sensors

我正在编写一个Android应用程序来记录所有传感器数据,但是在可变时间段应用程序不断崩溃传感器服务死亡日志之后,智能手机似乎重置了自己。 我的logcat看起来像这样:

I/sensorLis﹕ added MPL Accelerometer
I/sensorLis﹕ added MPL Gyroscope
I/sensorLis﹕ added Corrected Gyroscope Sensor
I/sensorLis﹕ added MPL Magnetic Field
I/sensorLis﹕ added MPL Gravity
I/sensorLis﹕ added Gravity Sensor
I/sensorLis﹕ added MPL Rotation Vector
I/sensorLis﹕ added Rotation Vector Sensor
D/dalvikvm﹕ GC_CONCURRENT freed 509K, 7% free 9687K/10375K, paused 6ms+4ms
D/dalvikvm﹕ GC_CONCURRENT freed 416K, 7% free 9674K/10375K, paused 9ms+1ms
D/dalvikvm﹕ GC_CONCURRENT freed 405K, 7% free 9676K/10375K, paused 13ms+4ms
D/dalvikvm﹕ GC_CONCURRENT freed 391K, 7% free 9676K/10375K, paused 4ms+1ms
D/dalvikvm﹕ GC_CONCURRENT freed 406K, 7% free 9677K/10375K, paused 5ms+3ms
D/dalvikvm﹕ GC_CONCURRENT freed 405K, 7% free 9678K/10375K, paused 6ms+6ms
D/dalvikvm﹕ GC_CONCURRENT freed 395K, 7% free 9681K/10375K, paused 1ms+2ms
D/dalvikvm﹕ GC_CONCURRENT freed 412K, 7% free 9680K/10375K, paused 9ms+3ms
D/dalvikvm﹕ GC_CONCURRENT freed 407K, 7% free 9679K/10375K, paused 3ms+3ms
D/dalvikvm﹕ GC_CONCURRENT freed 404K, 7% free 9681K/10375K, paused 6ms+3ms
D/dalvikvm﹕ GC_CONCURRENT freed 414K, 7% free 9689K/10375K, paused 8ms+3ms
D/dalvikvm﹕ GC_CONCURRENT freed 422K, 7% free 9680K/10375K, paused 4ms+4ms
D/dalvikvm﹕ GC_CONCURRENT freed 393K, 7% free 9680K/10375K, paused 4ms+2ms
D/dalvikvm﹕ GC_CONCURRENT freed 395K, 7% free 9690K/10375K, paused 6ms+6ms
D/dalvikvm﹕ GC_CONCURRENT freed 420K, 7% free 9682K/10375K, paused 5ms+2ms
D/dalvikvm﹕ GC_CONCURRENT freed 409K, 7% free 9680K/10375K, paused 4ms+3ms
D/dalvikvm﹕ GC_CONCURRENT freed 399K, 7% free 9680K/10375K, paused 6ms+5ms
D/dalvikvm﹕ GC_CONCURRENT freed 393K, 7% free 9682K/10375K, paused 6ms+2ms
D/dalvikvm﹕ GC_CONCURRENT freed 412K, 7% free 9680K/10375K, paused 5ms+3ms
D/dalvikvm﹕ GC_CONCURRENT freed 387K, 7% free 9681K/10375K, paused 6ms+3ms
W/Sensors﹕ sensorservice died [0x1e56260]
I/ActivityThread﹕ Removing dead content provider: settings
E/InputQueue-JNI﹕ channel '41d3d498 com.edu.jirka.naviin/com.edu.jirka.naviin.Navin (client)'

在崩溃的时候,我只有几个SensorDataSaver作为听众运行5到90秒的时间。

import android.app.Activity;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.util.Log;
import android.widget.Toast;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

/**
 * Created by Jirka on 8/21/2015.
 *
 * - designed for sensor data saving to files on external storage
 */

public class SensorDataSaver implements SensorEventListener{

    private SensorManager mSensorManager;
    private BufferedWriter bw;
    private Sensor mSensor;

    /**
     * class designed to save data of any 3D individual sensor.
     *
     * @param ma - activity for SensorManager, Resources access
     * @param header - basic info about sensor
     * @param ssr - sensor to by listen to
     */
    public  SensorDataSaver(Activity ma, String header, Sensor ssr, File sampleDir) {
        mSensor = ssr;
        mSensorManager = (SensorManager) ma.getSystemService(Context.SENSOR_SERVICE);
        try {
            // Header creation
            File mFile = new File(sampleDir, mSensor.getName().replace(" ", "_") + "_Data.txt");
            bw = new BufferedWriter(new FileWriter(mFile));
            bw.write(header);
            bw.append("Timestamp X_axis Y_axis Z_axis Current Accuracy\n");
        }catch (NullPointerException n){
            Log.e("File_Err","Fault during creating output file");
        } catch (IOException e) {
            Log.e("BuffW_Init","Fault during BufferedWriter init");
            e.printStackTrace();
        }

    }

    public void startCollecting(int del){
        mSensorManager.registerListener(this,mSensor,del);
        Log.i("sensorLis","added " + mSensor.getName());
    }

    public void finishCollecting(){
        // deploy listener
        mSensorManager.unregisterListener(this);
        // close file
        try {
            bw.close();
        } catch (IOException e) {
            Log.e("BuffW_Close","Fault during BufferedWriter closing");
            e.printStackTrace();
        }
    }


    /* onSensorChanged method of SensorListener */
    public void onSensorChanged(SensorEvent se) {
        try {
            bw.append(se.timestamp + " " + se.values[0] + " "
                    + se.values[1] + " " + se.values[2] + " " + se.sensor.getPower() + " "
                    + se.accuracy);
            bw.newLine();
        }catch (IOException e) {
            e.printStackTrace();
            Log.e("BW_APPEND",mSensor.toString() + " fault during appending sensor changes");
        }
    }

    /* onAccuracyChanged method of SensorListener */
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
        /* accuracy changes omitted due to accuracy logging in onSensorChanged
        try {
            bw.append("Accuracy " + sensor.getName() + " -> " + accuracy);
            bw.newLine();
        }catch (IOException e) {
            e.printStackTrace();
            Log.e("BW_APPEND", "Fault during appending accuracy changes");
        }*/
    }


}

那你有没有想过如何减少GC动作并防止传感器服务死亡? 我需要能够将传感器数据记录至少10分钟。

感谢。

1 个答案:

答案 0 :(得分:1)

  

那你有没有想过如何减少GC动作并防止传感器服务死亡?

我首先要清理onSensorChanged(),因为这将被调用很多,并且摆脱内存搅拌字符串连接:

public void onSensorChanged(SensorEvent se) {
    try {
        bw.append(se.timestamp);
        bw.append(" ");
        bw.append(se.values[0]);
        bw.append(" ");
        bw.append(se.values[1]);
        bw.append(" ");
        bw.append(se.values[2]);
        bw.append(" ");
        bw.append(se.sensor.getPower());
        bw.append(" ");
        bw.append(se.accuracy);
        bw.newLine();
    } catch (IOException e) {
        Log.e("BW_APPEND", mSensor.toString() + " fault during appending sensor changes", e);
    }
}

除此之外,使用开发工具确定您花费时间和RAM的位置。例如,Android Studio可以帮助您跟踪CPU使用情况和内存分配。