title: J2ME nokia s40 out of memory exception
body: <p>I am trying to read a 2mb file into a memory and then send that file to web server. But I am getting out of memory exception.</p>
  
  <pre><code>         FileConnection fileConn = (FileConnection)Connector.open("file:///" + pictureURI.getString(), Connector.READ);
       InputStream fis = fileConn.openInputStream();
       long overallSize = fileConn.fileSize();
  
       int chunkSize = 2048;
       int length = 0;
       while (length &lt; overallSize)
       {
  
          byte[] data = new byte[chunkSize];
          int readAmount = fis.read(data, 0, chunkSize);
          byte[] newImageData = new byte[rawImage.length + chunkSize];
          System.arraycopy(rawImage, 0, newImageData, 0, length);
          System.arraycopy(data, 0, newImageData, length, readAmount);
          rawImage = newImageData;
          length += readAmount;
  
       }
         fis.close();
          fileConn.close(); 
  </code></pre>
  
  <p>500kb files are uploading. What could be the reason? Please shed a light on this.</p>
  
  <p>I tried this also in loop but no use, System.gc();</p>
  
  <p><em>[EDIT]</em>
  <a href="https://stackoverflow.com/users/45668/malcolm">https://stackoverflow.com/users/45668/malcolm</a> has put me on right track. Now I struck here</p>
  
  <pre><code>  this.progress = progress;
  
    HttpConnection conn = null;
    OutputStream os = null;
    InputStream s = null;
    StringBuffer responseString = new StringBuffer();
  
    try
    {
       System.out.println(System.getProperty("HTTPClient.dontChunkRequests"));
       conn = (HttpConnection)Connector.open(url);
       //conn.setRequestProperty("User-Agent", "Profile/MIDP-2.1 Configuration/CLDC-1.1");
       conn.setRequestMethod(HttpConnection.POST);
  
       // The messages
       conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=---------------------------4664151417711");
       conn.setRequestProperty("Content-Length", "355");
  
       os = conn.openOutputStream();
  
       System.out.println("file name at upload " + fileName);
       String message1 = "";
       message1 += "-----------------------------4664151417711\r\n";
       message1 += "Content-Disposition: form-data; name=\"file\"; filename=\"" + fileName + "\"\r\n";
       message1 += "Content-Type: image/gif\r\n";
       message1 += "\r\n";
  
       os.write(message1.getBytes());
  
       System.gc();
  
       // Send the image
       int index = 0;
       int size = 2048;
       double progdouble;
       do
       {
          progdouble = ((double)index) / ((double)rawImage.length) * 100;
          progress.setValue((int)progdouble);
  
          if((index+size) &gt; rawImage.length)
          {
             size = rawImage.length - index;
          }
          os.write(rawImage, index, size);
          index += size;
  
          System.gc();
       } while(index &lt; rawImage.length);
  
       String message2 = "\r\n-----------------------------4664151417711\r\n";
       message2 += "Content-Disposition: form-data; name=\"number\"\r\n\r\n";
       message2 += this.user_phone_number;         
  
       os.write(message2.getBytes());
  
       String message3 = "\r\n-----------------------------4664151417711\r\n";
       message3 += "Content-Disposition: form-data; name=\"uuid\"\r\n\r\n";
       message3 += this.user_uuid;         
  
       os.write(message3.getBytes());
  
       String message4 = "\r\n-----------------------------4664151417711--\r\n";  
  
       os.write(message4.getBytes());
  
  
       os.flush();
       os.close();
  
       // Read
  
       s = conn.openInputStream();
       int ch, i = 0, maxSize = 16384;
       while(((ch = s.read())!= -1 ) &amp; (i++ &lt; maxSize)) 
       {
          responseString.append((char) ch);
       }
  
       conn.close();
       System.out.println("response =&gt;"+responseString.toString());
  
  
  
       return responseString.toString();
    }
    catch (IOException ioe)
    {
       return ioe.toString();
    }
  </code></pre>
  
  <p>Now its failing here.. </p>
  
  <p><em>[EDIT2]</em></p>
  
  <pre><code>// algorithm that will read 1024 bytes at a time 
          byte b[] = new byte[chunkSize];
          for (int i = 0; i &lt; overallSize; i += chunkSize) { 
  
              if ((i + chunkSize) &lt; overallSize) {
                  fis.read(b, 0, chunkSize);
              } else {
                  int left = (int)overallSize - i;
                  fis.read(b, 0, left);
              }
  
              // writing into the output stream - ( these lines will cause the "memory leak", without these, it will not happen)
              os.write(b);
              System.gc(); 
  
              progdouble = ((double)i) / ((double)overallSize) * 100;
              progress.setValue((int)progdouble); 
          }
          os.flush();
  </code></pre>
  
  <p>Thanks in advance.</p>