es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Recuperar memoria de java.lang.OutOfMemoryError: Espacio de almacenamiento de montón de Java

En mi programa de Java, obtengo la siguiente excepción “Exception in thread “main” java.lang.OutOfMemoryError: Java heap space” cuando intento ejecutarlo.

El programa utiliza ServerSocket y Socket para recibir paquetes desde un programa cliente, que también utiliza Socket. Anteriormente, estaba utilizando hilos para el servidor, pero ahora el programa solo contiene el método main y una función receptora.

Aquí está el código fuente:

public class TCPEmpfang {

private static final int TIMEOUT = 1000;

public static void main(String[] args) {
    new TCPEmpfang().startTCPEmpfang();
}

private void startTCPEmpfang() {
    try (ServerSocket serverSocket = new ServerSocket(4712)) {
        System.out.println("Esperando clientes...");
        while (true) {
                acceptConnection(serverSocket);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

private void acceptConnection(ServerSocket servSocket) {
    final long timeStart = System.currentTimeMillis();
    int sum = 0;
    try (Socket s = servSocket.accept()) {
        System.out.println("NEU");
        s.setSoTimeout(TIMEOUT);
        try (InputStream input = s.getInputStream();
             DataInputStream dis = new DataInputStream(input)) {
            while (true) {
                int dataSize = dis.readInt();
                byte[] data = new byte[dataSize];
                dis.readFully(data);
                sum += dataSize;
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    long timeEnd = System.currentTimeMillis();
    final long timeDiff = timeEnd - timeStart;
    final double goodPut = (double) sum / timeDiff * 8 / 1000;

    System.out.println("El goodput fue: " + goodPut + " kbit/s");

    writeResults(goodPut);
}

Mi pregunta es ¿por qué ocurre esta excepción en este programa? Y estoy interesado en cómo saber si hay una fuga de memoria y si puede haber una fuga de memoria en IntelliJ (JetBrains) en general.

He leído mucho sobre cómo expandir el montón, pero no estoy interesado en eso.

Gracias por sus respuestas 🙂

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El OutOfMemoryError en el programa ocurre porque el espacio de memoria heap asignado a Java se ha agotado. Esto puede suceder cuando el programa ha retenido demasiados objetos en memoria y el recolector de basura no puede limpiar suficiente espacio. En este caso específico, el programa recibe continuamente paquetes de un cliente y asigna memoria para los datos recibidos, llenando eventualmente la memoria asignada y provocando el OutOfMemoryError.

    Para verificar posibles fugas de memoria en el programa, puede utilizar herramientas como Java Flight Recorder o Java VisualVM. Estas herramientas pueden monitorear el uso de memoria del programa e identificar cualquier objeto que no esté siendo recolectado por el recolector de basura, determinando así donde se están reteniendo.

    Es posible tener fugas de memoria en IntelliJ (JetBrains), ya que solo es un entorno de desarrollo integrado (IDE) y no afecta directamente la administración de memoria del programa en desarrollo. Sin embargo, el uso del perfilador de memoria incorporado en IntelliJ puede ayudar a identificar y solucionar fugas de memoria en su programa.

    Ampliar el heap es una solución a corto plazo y no abordará ninguna fuga de memoria. Es importante identificar y solucionar cualquier fuga de memoria en el programa para prevenir futuras apariciones del OutOfMemoryError.

Comments are closed.