Saliendo del error de memoria al leer responder desde el servicio web

Estoy tratando de llamar a un servicio web, la respuesta contiene una cadena grande, saliendo del problema de memoria, el código es

 URL u = new URL(SharedVariables.server);
           URLConnection uc = u.openConnection();
           HttpURLConnection connection = (HttpURLConnection) uc;
           connection.setConnectTimeout(SharedVariables.connectionTimedOutValue);
           connection.setDoOutput(true);
           connection.setDoInput(true);
           connection.setRequestProperty("SOAPAction", SOAP_ACTION);
           connection.setRequestMethod("POST");
           connection.setRequestProperty("Content-type", "text/xml; charset=utf-8");

           String xmldata = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" + 
                            "<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\"> "+ 
                            "<soap:Body>"+
                            "<GetCaseCriminalTicketLinks xmlns=\"http://tempuri.org/\">"+   
                            Req.getRequestXml()+                            
                            "</GetCaseCriminalTicketLinks>"+
                            "</soap:Body>"+
                            "</soap:Envelope>";        

           OutputStream out = connection.getOutputStream();
                Writer wout = new OutputStreamWriter(out);
                wout.write(xmldata);
                wout.flush();                   
                out.flush();                    


              BufferedReader rd = new BufferedReader(new InputStreamReader(connection.getInputStream()),8 * 1024);

              String result;    

              while ((result=rd.readLine()) != null) {


              int length = result.length();               
               String temp = result.substring(316, (length - 100));           

               JSONObject tempJson = new JSONObject(temp);}

El registro es

Caused by: java.lang.OutOfMemoryError
at java.lang.String.<init>(String.java:513)
at java.lang.AbstractStringBuilder.toString(AbstractStringBuilder.java:650)
at java.lang.StringBuilder.toString(StringBuilder.java:664)
at java.io.BufferedReader.readLine(BufferedReader.java:398)

esta linea esta causando

while ((result=rd.readLine()) != null) 

Alguna sugerencia?

Muchas Gracias

preguntado el 10 de marzo de 12 a las 07:03

¿Cuánto mide la línea que intentas leer? -

1 Respuestas

Para todas las variables disponibles en el while ((result=rd.readLine()) != null) bucle, la memoria se creará en el montón, como mencionó que está tratando de transmitir alrededor de 1 MB de datos, el bucle se ejecutará durante mucho tiempo, por lo que obviamente el montón se ha sobrecargado para almacenar los datos.

Mis sugerencias:

  1. Intente transmitir la cantidad mínima de datos y verifique
  2. Evite tener instanciación de objetos dentro del bucle, use referencias en su lugar.
  3. Encuentre una manera de aumentar el tamaño de la memoria JVM

Los enlaces a considerar son:

Aumentar el tamaño del montón en java

JVM-Java aumenta el tamaño del montón

contestado el 23 de mayo de 17 a las 11:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.