2016-12-09 5 views
0

J'ai une méthode dans un projet j2me dans laquelle, après 2 jours de fonctionnement normal, elle s'effondre. L'erreur présentée est la suivante:J2me - OutofMemory dans la requête HTTP

Contacting website... 
java.lang.OutOfMemoryError 
    (stack trace incomplete) 

Cette méthode est celle utilisée pour communiquer avec un site Web. Il reçoit une chaîne et un sélecteur de mode (i = 1 ou smth else) et procède avec la requête. Voici le code:

void enviarPost(int i, String comando)throws IOException, IllegalStateException, IllegalArgumentException, ATCommandFailedException{  
     System.out.println("Contacting website..."); 
     if(i == 1) 
      { 
      url = "http://websitedummy.com.pl/index.php?IMEI=" + imeiX + "&IP=" + ipX; 
      } 
      //53543D303B44723D4E616F 
      else 
      { 
      url2 = comando;    
      url = "http://websitedummy.com.pl/index.php?data={\"IMEI\":\""+imeiX+"\",\"TS\":\"20/04/13-08:31:44\",\"SER\":\""+url2+"\"}";     

      } 



      try { 
       Thread.sleep(1000); 
       connection = (HttpConnection) Connector.open(url); 
       Thread.sleep(500); 
       connection.setRequestMethod(HttpConnection.GET); 
       Thread.sleep(500); 
       connection.setRequestProperty("Content-Type", "text/plain"); 

       Thread.sleep(500); 
       int con = 0; 
       try{ 
       con = connection.getResponseCode(); 
       } catch (Exception e4) 
       { 
        System.out.println(e4); 

       }     
       if (con == HttpConnection.HTTP_OK) { 
        System.out.println("Vamos"); 
        inputstream_ = connection.openInputStream(); 
        int ch; 
        while ((ch = inputstream_.read()) != -1) { 
         dataReceived.append((char) ch); 

        } 

        System.out.println("Atualizado."); 

        acabouatualizar=1; 

        inputstream_.close(); 
        connection.close(); 
       } else { 
        System.out.println("Error"); 
        // Connection not ok 
       } 
      } catch (Exception e) { 
       System.out.println("EXCEÇÂO 1 - " + e); 

      } finally { 
       if (inputstream_ != null) { 
        try { 

         inputstream_.close(); 

        } catch (Exception e1) { 
         System.out.println("EXCEÇÂO 2- " + e1); 
        } 
       } 
       if (connection == null) { 
        try { 
         System.out.println("Fechou conexao."); 
         connection.close(); 

        } catch (Exception e2) { 
         System.out.println("EXCEÇÂO 3- " + e2); 
        } 
       } 
      } 
      } 

Pour résoudre le problème, j'ai pensé à effacer toutes les variables utilisées dans la connexion. Le problème est que je dois être presque sûr de la nature du problème car l'erreur prendra 2 jours et cela me coûtera beaucoup de temps.

Des suggestions? Merci les gars.

+0

Pouvez-vous fournir plus de trace de pile? –

+0

Malheureusement, c'est la seule sortie que je reçois à ce moment .. – kohhworlwide

+1

Il y a quelques erreurs dans votre code. Puisque vous avez fermé l'inputtream et la connexion dans finally block, vous n'avez pas besoin de les fermer dans la branche if. Et changez if (connection == null) if (connection! = Null). –

Répondre

0

Il est difficile de dire ce qui cause l'exception outOfMemoryError, mais il existe des façons de travailler avec. La cause profonde de ce problème peut se rapporter à ceci:

  1. la mémoire est assez dans la machine virtuelle Java;
  2. Les threads natifs ne suffisent pas, impossible de créer plus de threads;

Vous pouvez utiliser jconsole pour déboguer ce problème, qui est un outil pour jeter un oeil à la mémoire, les fils, les classes utilisation dans la machine virtuelle Java. En outre, le message d'exception peut signaler la cause première dans certains cas.