Sobes.tech
Junior

Ի՞նչ է OOM (Հիշողության բացթողում)

sobes.tech AI

Պատասխան AI-ից

OOM (Out of Memory) — դա ժամանակի ընթացքում տեղի ունեցող սխալ է, որը տեղի է ունենում, երբ ծրագիրը կամ համակարգը սպառել է մատչելի օպերատիվ հիշողությունը և չի կարող նոր հիշողություն հատկացնել:

Տարբեր տեխնոլոգիաների համատեքստում դա տարբեր կերպ է արտահայտվում:

  • Java Virtual Machine (JVM): արտանետվում է OutOfMemoryError բացառություն: պատճառները կարող են տարբեր լինել, օրինակ՝
    • Փոքր հիպի չափը (java.lang.OutOfMemoryError: Java heap space):
    • Խոչընդոտներ թելերով կամ դասերով (java.lang.OutOfMemoryError: unable to create new native thread, java.lang.OutOfMemoryError: Metaspace):
    • Հիշողության արտահոսք:
  • Օպերացիոն համակարգեր: Կենդանի միջուկը գործարկում է OOM Killer-ը, որը երբ հիշողությունը սպառվում է, ուժեղ կերպով ավարտում է ռեսուրսների բարձր սպառմամբ գործընթացները՝ փորձելով ազատել հիշողությունը համակարգի շարունակական աշխատանքի համար: Ընտրությունը հիմնված է հուշումային մեթոդների վրա (օրինակ՝ հիշողության սպառում, գործընթացի առաջնահերթություն):

OOM-ի պատճառները՝

  • Անբավարար տրամադրված հիշողության ծավալ: Ծրագիրը կամ համակարգը պարզապես չունի ֆիզիկական կամ կոնֆիգուրացված հիշողություն:
  • Հիշողության արտահոսք: Ծրագիրը հատկացնում է հիշողություն, բայց չի ազատում այն, երբ այն այլևս անհրաժեշտ չէ, ինչը հանգեցնում է աստիճանաբար հասանելի հիշողության սպառմանը:
  • Անարդյունավետ հիշողության օգտագործում: Ալգորիթմները կամ տվյալների կառուցվածքները օգտագործում են շատ հիշողություն՝ կատարվող գործառույթի համար:
  • Հանկարծակի հիշողության սպառման աճ: Օրինակ՝ շատ մեծ տվյալների հավաքածուի մշակումը:

Որպեսզի ախտորոշել և կանխել OOM-ը, օգտագործվում են տարբեր գործիքներ և մոտեցումներ:

  • Հսկողություն: Հսկողության համակարգեր (Prometheus, Grafana) թույլ են տալիս հետևել գործընթացների և համակարգի ընդհանուր հիշողության օգտագործմանը:
  • Պրոֆիլատորներ: (JProfiler, VisualVM Java-ի համար) օգնում են վերլուծել ծրագրի հիշողության սպառումը և գտնել արտահոսքերը:
  • Հիշողության սահմանների կարգավորում: Հիշողության սահմանների ավելացում գործընթացների կամ համակարգերի համար (օրինակ՝ -Xmx JVM-ի համար, cgroup սահմանափակումներ Kubernetes-ում):
  • Կոդի օպտիմիզացում: Ալգորիթմների և տվյալների կառուցվածքների վերանայում՝ ավելի արդյունավետ օգտագործելու համար:
  • Հիշողության դամպների վերլուծություն: Ծրագրի հիշողության վիճակի ուսումնասիրություն OOM-ի պահին՝ պատճառների հայտնաբերման համար:

Kubernetes-ում Pod-ի հիշողության սահմանափակման օրինակ:

# Կոնտեյների ռեսուրսային սահմանափակումների սահմանում Pod-ում
resources:
  limits:
    memory: "256Mi" # Մաքսիմալ հիշողության սպառում
  requests:
    memory: "128Mi" # Գаранտավորված հիշողության սպառում