【问题标题】:Background service using too much memory后台服务占用过多内存
【发布时间】:2018-10-24 07:42:49
【问题描述】:

对于我的一个聋哑朋友,我正在尝试创建应用程序(用于智能手表和手机),当有人按门铃时会向他发出警告。智能手表会振动,这样他就知道有人在门前。

为了知道是否有人在按门铃,我创建了一个服务器,它通过套接字向电话发送消息。手机会在服务中监听这个,然后当它收到消息时,它会通过数据层 api 将数据发送到智能手表以进行振动。

现在我让后台服务正常工作,但它正在使用大量内存。几天后,我在手机上看到一条消息,说该应用程序正在使用大量内存,因此它会自动关闭该应用程序。我的问题是什么在我的服务中使用了大量内存?我使用的socket io库不能在后台使用吗?

(同样每隔几分钟,用户就会断开与服务器的连接并重新连接,这种情况会一直持续下去)

这是我创建的服务:

import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;

import io.socket.client.IO;
import io.socket.client.Socket;
import io.socket.emitter.Emitter;
import nl.example.messenger.Messenger;

public class SocketIOService extends Service {

    private final static String mSocketUrl = "https://example.io/";
    private Socket mSocket;
    private Messenger mMessenger;
    private final LocalBinder mBinder = new LocalBinder();

    public class LocalBinder extends Binder{
       public SocketIOService getService(){
            return SocketIOService.this;
        }
    }

    @Override
    public IBinder onBind(Intent intent) {
       return mBinder;
    }

    @Override
    public boolean onUnbind(Intent intent) {
        return false;
    }

    @Override
    public void onCreate() {
        super.onCreate();

        initializeSocket();
        addSocketHandlers();

        mMessenger = new Messenger(this);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        closeSocketSession();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return START_STICKY;
    }

    private void initializeSocket() {
        try{
            IO.Options options = new IO.Options();
            options.forceNew = true;
            mSocket = IO.socket(mSocketUrl, options);
        }
        catch (Exception e){
            Log.e("Error", "Exception in socket creation");
            throw new RuntimeException(e);
        }
    }

    private void closeSocketSession(){
        mSocket.disconnect();
        mSocket.off();
    }

    private void addSocketHandlers(){

        mSocket.on("message", new Emitter.Listener() {
            @Override
            public void call(Object... args) {
                mMessenger.sendMessage("Socket: Got a new message.");
            }
        });

        mSocket.connect();
    }
}

【问题讨论】:

  • 这里没有足够的代码来做出这个决定。您提供的内容不太可能导致如此严重的内存泄漏。不太可能是 Socket.IO。有关如何分析内存的说明,请参阅 here
  • 除此之外,只有 1 个活动刚刚开始服务。但我会看看说明!

标签: java android performance websocket socket.io


【解决方案1】:

你需要GC工具来定位内存泄漏位置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-19
    • 2019-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-14
    相关资源
    最近更新 更多