1

50ミリ秒ごとにフレーム(UDP)をキャプチャし、このデータでビューを更新するアプリケーションがあります。しかし、私のアプリケーションは2秒ごとに100/200msの間フリーズしています。LogCatに、GC_CONCURRENTというメッセージが表示されます。

このメッセージとフリーズの間にリンクが存在するかどうかはわかりません。はいの場合、これを回避するための解決策はありますか?`

            try {
                view.setClientSocket(new MulticastSocket(54321));
                ip = InetAddress.getByName("224.2.2.4");
                view.getClientSocket().joinGroup(ip);

            } catch (SocketException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            int cpt = 0;
            while(true){
                cpt++;
            try {
                if (view.isPort_change() == true){
                    view.setClientSocket(new MulticastSocket(54321));
                    ip = InetAddress.getByName("224.2.2.4");
                    view.getClientSocket().joinGroup(ip);
                    view.setPort_change(false);
            }

            int result = -1;            
            if(view.isCapture() == true && listeinit==true)
            {
                DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length,ip,54321);    
                view.getClientSocket().receive(receivePacket); 
                String modifiedSentence = new String(receivePacket.getData(),0,receivePacket.getLength());

                for(int i=0; i<modifiedSentence.split("\\+").length; i++)
                {
                    String[] donnee = modifiedSentence.split("\\+")[i].split(":");
                    for(Hashtable.Entry<Integer, String> entry : view.getAll_parameters().entrySet()){
                        if(entry.getValue().equals(donnee[0])){
                            result = entry.getKey();
                            break;
                        }
                    }
                    if (result== -1)
                    {
                        view.getBloc().add(donnee[1]);
                    }
                    else
                    {
                        view.getBloc().set(result,donnee[1]);                           
                    }
                }
             //     if(cpt%5==0)
                    {

                        view.getHandler().sendEmptyMessage(1);
                    }
            }
        }`
4

1 に答える 1

1

GC_CONCURRENT は、ガベージ コレクションが発生していることを意味します。大量のメモリの割り当て/割り当て解除を行っており、JVM は 2 秒ごとにガベージ コレクションを行う必要があります。パケットを送信するたびにメモリへの参照を割り当てて失うのではなく、メモリの再利用を試みる必要があります。

于 2012-10-29T17:42:27.997 に答える