Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

260
Visualizações
Qué pérdidas de memoria pueden ocurrir fuera de la vista del generador de perfiles de montón de GHC

Tengo un programa que exhibe el comportamiento de una fuga de memoria. Gradualmente ocupa toda la memoria del sistema hasta que llena todo el espacio de intercambio y luego el sistema operativo lo elimina. Esto sucede una vez cada varios días.

He perfilado extensamente el montón de varias maneras (-hy, -hm, -hc) y he intentado limitar el tamaño del montón (-M128M) ajustado el número de generaciones (-G1) pero no importa lo que haga, el tamaño del montón parece constante -ish y bajo siempre (medido en kB, no en MB o GB). Sin embargo, cuando observo el programa en htop, su memoria residente aumenta constantemente.

Lo que esto me indica es que la fuga de memoria proviene de algún lugar además del montón de GHC. Mi programa utiliza dependencias, específicamente la biblioteca yaml de Haskell que envuelve la biblioteca C libyaml , es posible que la fuga esté en la cantidad de punteros externos que tiene para los objetos asignados por libyaml .

Mi pregunta es triple:

  1. ¿De qué lugares, además del montón de GHC, se puede perder la memoria en un programa de Haskell?
  2. ¿Qué herramientas puedo usar para rastrearlos?
  3. ¿Qué cambios se deben realizar en mi código fuente para evitar este tipo de fugas, ya que parecen diferir de las fugas de espacio más comunes en Haskell?
over 4 years ago · Santiago Trujillo
1 Respostas
Responde à pergunta

0

Esto ciertamente suena como que los punteros extranjeros no se están finalizando correctamente. Hay varias razones posibles para esto:

  1. La biblioteca C subyacente no libera memoria correctamente.
  2. La biblioteca de Haskell no configura la finalización correctamente.
  3. Los objetos ForeignPtr no se liberan.

Creo que en realidad hay una posibilidad decente de que sea la opción 3. Si el RTS constantemente encuentra suficiente memoria en la primera generación de GC, entonces simplemente no se molestará en ejecutar una colección importante. Afortunadamente, este es el más fácil de diagnosticar. Simplemente haga que su programa ejecute System.Memory.performGC de vez en cuando. Si eso lo soluciona, ha encontrado el error y puede modificar la frecuencia con la que desea hacerlo.

Otro posible problema es que podría tener punteros extraños en thunks de larga duración u otros cierres. Asegúrate de no hacerlo.


Una posibilidad particularmente fuerte cuando se trabaja con una biblioteca C envuelta es que las funciones de envoltorio devolverán ByteString s cuyas matrices subyacentes fueron asignadas por código C. Por lo tanto, cualquier ByteString que obtenga de yaml podría estar fuera del montón.

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda