Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

BUG Memory leak when use agent

Abierto
#135 7 comentarios 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
4/5
Tiempo estimado
3-5 días
Aptitud para principiantes
25/100
Tipo de issue
Error
Claridad
Necesita aclaración
Estado de actividad
Estancado
Stack tecnológico
java

Línea de trabajo

Comienza en la llamada a PyroscopeAgent.start y sigue cómo el agente gestiona las instantáneas repetidas y la implementación personalizada de GalileoProfileExporter.export. Reproduce el informe con la configuración 0.12.0 proporcionada y supervisa la memoria mientras se ejecutan las cargas. El trabajo estará terminado cuando se haya identificado el origen del crecimiento sostenido de la memoria y el agente ya no retenga inesperadamente los datos de profiling completados.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

I use 0.12.0 agent upload JFR data to my backend.

<dependency>
            <groupId>io.pyroscope</groupId>
            <artifactId>agent</artifactId>
            <version>0.12.0</version>
 </dependency>

Upload code:

Config profileConfig = new Config.Builder()
                    .setFormat(Format.JFR)
                    .setLogLevel(Logger.Level.INFO)
                    .setProfilingEvent(EventType.ITIMER)
                    .setProfilingAlloc("0")
                    .setProfilingInterval(Duration.ofMillis(10))
                    .setUploadInterval(Duration.ofSeconds(5))
                    .build();
GalileoProfileExporter exporter = new GalileoProfileExporter(resource, DEFAULT_RETRY);
PyroscopeAgent.start(new PyroscopeAgent.Options.Builder(profileConfig).setExporter(exporter).build());

My exporter:

public class GalileoProfileExporter implements Exporter {
    private static final Duration TIMEOUT = Duration.ofSeconds(10);
    private static final String ENDPOINT = "https://xxxxxxxxxxxxx";

    final Ocp.Resource resource;
    final int ingestMaxTries;
    final Logger logger = new DefaultLogger(Logger.Level.INFO, System.err);
    final OkHttpClient client = new OkHttpClient.Builder()
            .connectTimeout(TIMEOUT)
            .readTimeout(TIMEOUT)
            .callTimeout(TIMEOUT)
            .build();

    public GalileoProfileExporter(Ocp.Resource resource, int ingestMaxTries) {
        this.resource = resource;
        this.ingestMaxTries = ingestMaxTries;
    }

    @Override
    public void export(Snapshot snapshot) {
        final HttpUrl url = HttpUrl.parse(ENDPOINT);
        logger.log(Logger.Level.INFO, "Upload profile. %s %s JFR: %s",
                snapshot.started.toString(), snapshot.ended.toString(), snapshot.data.length);
        byte[] reqBody = constructReqBody(snapshot);
        byte[] compressedData = new byte[0];
        try {
            compressedData = Snappy.compress(reqBody);
        } catch (IOException e) {
            logger.log(Logger.Level.ERROR, "Error compress snapshot.");
        }
        MediaType type = MediaType.parse("application/octet-stream");
        RequestBody jfrBody = RequestBody.create(compressedData, type);
        Request.Builder request = new Request.Builder()
                .post(jfrBody)
                .url(url);
        request.header("language", "java");

        try (Response response = client.newCall(request.build()).execute()) {
            int status = response.code();
            if (status >= 400) {
                ResponseBody body = response.body();
                final String responseBody;
                if (body == null) {
                    responseBody = "";
                } else {
                    responseBody = body.string();
                }
                logger.log(Logger.Level.ERROR, "Error uploading snapshot: %s %s", status, responseBody);
            }
            if (status == 200) {
                logger.log(Logger.Level.INFO, "Success upload jfr");
            }
        } catch (final IOException e) {
            logger.log(Logger.Level.ERROR, "Error uploading snapshot: %s", e.getMessage());
        }
    }

    private byte[] constructReqBody(Snapshot snapshot) {
        Otp.Profile.Builder profile = Otp.Profile.newBuilder()
                .setName("jfr")
                .setType("cpu")
                .setData(ByteString.copyFrom(snapshot.data));
        Otp.ProfilesBatch profilesBatch = Otp.ProfilesBatch.newBuilder()
                .setSequence(1)
                .setStart(snapshot.started.toEpochMilli() / 1000)
                .setEnd(snapshot.ended.toEpochMilli() / 1000)
                .setResource(this.resource)
                .addProfiles(profile)
                .build();
        return profilesBatch.toByteArray();
    }

}

When I opened the agent report, I found that the memory was constantly rising, and I suspected there was a memory leak situation
image

Is there anyone who has encountered similar problems with me, or is there a problem with where I wrote it? Thanks

Lenguaje dominante
Java
Estrellas
125
Forks
48
Métricas de merge de PR
Sin PR fusionados en 30 d

Preparar el entorno

Este proyecto no incluye contenedor de desarrollo, Dockerfile ni guía de contribución, así que la configuración corre por tu cuenta: empieza por su README y consulta nuestra guía para la primera contribución para los pasos generales.

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de grafana/pyroscope-java

Todos los issues de grafana/pyroscope-java

Issues similares

Más issues de Java

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.