Sobes.tech
Junior

Ինչ է Out of Memory (OOM)-ը։

sobes.tech AI

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

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

Օպերացիոն համակարգերի համատեքստում, OOM տեղի է ունենում, երբ համակարգը չի կարող հատկացնել հիշողություն նոր պրոցեսի կամ թելերի համար: Համակարգի ամբողջական անկումից խուսափելու համար, Linux-ում կա OOM Killer — մեխանիզմ, որը ուժեղ կերպով փակում է շատ հիշողություն սպառող պրոցեսները, ազատելով ռեսուրսները:

Հավելվածների համատեքստում, OOM առաջանում է, երբ Java վիրտուալ մեքենան (JVM) կամ այլ լեզվի գործարկման միջավայրը չի կարող հատկացնել հիշողություն հողում (heap) նոր օբյեկտ ստեղծելու համար:

OOM-ի պատճառները կարող են տարբեր լինել՝

  • Հիշողության լիքեր (Memory Leaks): Օբյեկտները, որոնք այլևս չեն օգտագործվում, մնում են հիշողության մեջ, քանի որ դրանց վրա պահվում են հղումներ, որոնք խոչընդոտում են գարշահավաքի մաքրմանը:
  • Ավելի մեծ հիշողության պահանջ: Հավելվածը պահանջում է կամ պահում է շատ մեծ հիշողություն տվյալների մշակման համար (օրինակ՝ մեծ ֆայլ ամբողջությամբ բեռնում է հիշողության մեջ):
  • Անբավարար հիշողության հատկացում: JVM-ի կարգավորումները (օրինակ՝ -Xmx) կամ գործարկման միջավայրի կոնֆիգուրացիան չի ապահովում բավարար հիշողություն հավելվածի աշխատանքի համար:
  • Սխալ կոնֆիգուրացիա թելերի կամ կապերի պուլերի համար: Շատ ակտիվ թելեր կամ կապեր կարող են սպառել մեծ քանակությամբ հիշողության ստեկի (թելերի համար) կամ այլ հիշողության տարածքների:

OOM-ի նշանները հավելվածի մակարդակում հաճախ են՝

  • Հավելվածի աշխատանքի դանդաղում:
  • OutOfMemoryError արտահայտության հայտնվելը լոգերում:
  • Գարշահավաքի կատարողականության անկում:

OOM-ի ախտորոշման համար կիրառվում են հետևյալ մոտեցումները՝

  • Լոգների վերլուծություն: OutOfMemoryError արտահայտությունների և OOM Killer հաղորդագրությունների որոնում:
  • Հողային դամպների հավաքում: Հատկության պահպանումը սխալի առաջացման պահին՝ հետագա վերլուծության համար (օրինակ՝ Eclipse Memory Analyzer Tool (MAT), VisualVM):
  • Հսկողություն: Օգտագործել համակարգային հսկողության համակարգեր (Prometheus, Grafana, New Relic)՝ JVM-ի հիշողության օգտագործումը և օպերացիոն համակարգը հետևելու համար:
  • Պրոֆիլավորում: Օգտագործել պրոֆիլերներ (JProfiler, YourKit)՝ հիշողության օգտագործման մոդելների և լիքերի աղբյուրների հայտնաբերման համար:
// Օրինակ Java կոդ, որը կարող է հանգեցնել OOM-ի (հիշողության լիքով)
import java.util.ArrayList;
import java.util.List;

public class OOMExample {
    private List<Object> largeList = new ArrayList<>();

    public void addObjects() {
        while (true) {
            largeList.add(new Object()); // Շարունակական օբյեկտների ավելացում առանց հեռացման
        }
    }

    public static void main(String[] args) {
        OOMExample example = new OOMExample();
        example.addObjects();
    }
}
# Օրինակ հրամանի Java-ны արագ ցուցադրության համար՝ հիշողության սահմանափակումով
java -Xmx64m OOMExample

OOM-ի կանխարգելումը ներառում է՝

  • Կոդի օպտիմալացում հիշողության արդյունավետ օգտագործման համար:
  • JVM-ի կամ գործարկման միջավայրի հիշողության կարգավորումների ճիշտ կազմավորում:
  • Հողային դամպների և պրոֆիլավորման ռեգուլար վերլուծություն:
  • Հիշողության օգտագործման հսկողություն արտադրական միջավայրում։