J2me - HTTP 请求中的内存不足

Posted

技术标签:

【中文标题】J2me - HTTP 请求中的内存不足【英文标题】:J2me - OutofMemory in HTTP request 【发布时间】:2016-12-09 09:18:46 【问题描述】:

我在一个 j2me 项目中有一个方法,在正常工作 2 天后,它崩溃了。出现的错误如下:

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

上述方法是用于与网站通信的方法。它接收一个字符串和一个模式选择器(i=1 或其他)并处理请求。代码如下:

 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);
                    
                
            
            

为了解决这个问题,我考虑清除连接中使用的所有变量。问题是我必须几乎确定问题出在哪里,因为错误需要 2 天时间才会发生,这将花费我大量时间。

有什么建议吗? 谢谢大家。

【问题讨论】:

你能提供更多的堆栈跟踪吗? 遗憾的是,这是我当时得到的唯一输出.. 您的代码中有一些错误。由于您已经在 finally 块中关闭了输入流和连接,因此您不需要在 if 分支中关闭它们。并将 if (connection == null) 更改为 if (connection != null)。 哦!感谢您指出那些!已经改正了。不过,这个问题不太可能解决,对吧? 也许,您可以使用 jconsole 查看 JVM 状态并找出根本原因。 【参考方案1】:

很难说导致outOfMemoryError 异常的原因,但有一些方法可以处理它。这个问题的根本原因可以参考这个:

    JVM 内存不足; 原生线程不够,无法创建更多线程;

您可以使用 jconsole 来调试这个问题,这是一个查看 JVM 中的内存、线程、类使用情况的工具。此外,在某些情况下,异常消息可以指出根本原因。

【讨论】:

以上是关于J2me - HTTP 请求中的内存不足的主要内容,如果未能解决你的问题,请参考以下文章

Java内存不足怎么办?

J2me 应用程序在多个时间文件播放时出现内存不足异常

谁知道电脑出现“系统资源不足,无法完成请求”是啥原因?

电脑文件无法打开每次打开它都显示“无法访问!系统资源不足,无法完成请求的服务”

内存不足怎么办

如何解决“内存不足”的问题