مدیریت حافظه GoLang – بلاگ Calsoft

Golang یا Go که توسط گوگل توسعه یافته است یک زبان برنامه نویسی جالب است که نه تنها سریع، بلکه در عین حال ساده و قدرتمند است. ویژگی Go با سادگی، ویژگی‌های داخلی، و مدل همزمانی برای توسعه کارآمد، مشخص می‌شود و دارای معماری ساده و طراحی ساده است که خوانایی و قابلیت نگهداری را افزایش می‌دهد.

تازه از نقطه نظر نوآوری، سیستم برنامه نویسی از ابتدا برای ایجاد یک راه حل ساده، حداقلی و خوشه ای طراحی شد که فضایی را برای چند رشته ای عظیم، همزمانی و عملکرد تحت فشار باقی می گذارد.

این ایده که در ابتدا برای نرم افزارهای زیرساخت شبکه و فناوری اطلاعات توسعه یافته بود، برای جایگزینی زبان های با کارایی بالا مانند جاوا و ++C طراحی شد. اما امروزه این زبان امیدوارکننده برای چندین کاربرد مورد استفاده قرار می گیرد.

Go بر چابکی، سادگی و قابلیت اطمینان تمرکز دارد و یک زبان برنامه نویسی است که باید به آن دقت کنید. وبلاگ ما گردآوری شده است تا به شما کمک کند یک مرور کلی از مدیریت حافظه در Golang با تمرکز بر اهمیت و مکانیسم های آن داشته باشید. ما همچنین موضوعاتی مانند تخصیص حافظه، جمع آوری زباله، دستکاری پشته و تکنیک های اشکال زدایی را پوشش می دهیم. ایده آل برای مبتدیان و توسعه دهندگان با تجربه، بینش های عملی را برای بهینه سازی استفاده از حافظه و اشکال زدایی برنامه های Golang ارائه می دهد.

چرا گولنگ؟

Go، ایجاد شده توسط گوگل، یک زبان برنامه نویسی محبوب است که به دلیل سادگی و کارایی بالا شناخته شده است. به طور گسترده ای برای برنامه نویسی ابری و سیستمی، توسعه سرور بازی و وظایف پردازش کلمه استفاده می شود. شرکت‌های بزرگی مانند Google، Dropbox، SoundCloud، Docker، Cloudflare و BBC برای پروژه‌های خود به Go متکی هستند و قدرت و قابلیت اطمینان آن را به نمایش می‌گذارند.

Go آسان است برای یادگیری، توسعه، کامپایل، استقرار، و اجرا، و آن را در میان توسعه دهندگان مورد علاقه. Go که با در نظر گرفتن محاسبات ابری طراحی شده است، دارای امکانات تست داخلی برای تست کد یکپارچه است. پشتیبانی آن از کامپایل متقابل، همراه با در دسترس بودن آموزش های گسترده، تطبیق پذیری آن را افزایش می دهد. علاوه بر این، جمع‌آوری زباله کارآمد Go مدیریت حافظه را ساده می‌کند و عملکرد نرم و کارآمد برنامه را تضمین می‌کند.

مروری بر مدیریت حافظه در Go
همانطور که برنامه های کامپیوتری اجرا می شوند، آنها اشیاء را در حافظه می نویسند. در عین حال لازم است در مواقعی که نیازی به این موارد نیست، از شر آنها خلاص شوید. این فرآیند چیزی جز مدیریت حافظه نیست.

او می رود از مدیریت خودکار حافظه مانند تخصیص خودکار حافظه و جمع آوری خودکار زباله استفاده می کند که از بسیاری از خطاهای مداوم جلوگیری می کند.

بلوک حافظه بخشی از حافظه پایدار است و بلوک های حافظه می توانند در اندازه های مختلف باشند. که در او می رودیک بلوک حافظه ممکن است چندین مقدار را میزبانی کند مانند ساختار، ماتریس، تراشه و غیره

چه زمانی یک بلوک حافظه در Golang اختصاص داده می شود؟

در Go، حافظه به طور عمده در دو سناریو تخصیص داده می شود: هنگام استفاده از new و make. پارامترهای عملکردی و متغیرهای محلی معمولاً روی پشته تخصیص داده می شوند که دسترسی سریع و پاکسازی خودکار را فراهم می کنند. با این حال، برای نیازهای حافظه پویا، Go عملکردها و توابع تولید جدیدی را ارائه می دهد.

  • تابع جدید یک بلوک حافظه را اختصاص می دهد و معمولاً برای تولید مقادیر برای انواع ساختار استفاده می شود. اشاره گر را به حافظه اختصاص داده شده جدید برمی گرداند.
  • از سوی دیگر، make برای ایجاد برش ها، نقشه ها و کانال ها استفاده می شود. برخلاف new، make چندین بلوک حافظه را اختصاص می‌دهد و مقدار اولیه را برمی‌گرداند. به عنوان مثال، یک برش ایجاد شده با استفاده از فرآیند نوشتن می‌تواند به صورت پویا با استفاده از تابع append داخلی رشد کند که در صورت نیاز حافظه را افزایش می‌دهد.

درک این روش‌های تخصیص به مدیریت کارآمد حافظه در Go کمک می‌کند و عملکرد بهینه و استفاده بهینه از منابع را تضمین می‌کند.

بلوک حافظه به کجا اختصاص داده شده است؟

در Go، بسته به نحوه مدیریت حافظه، تخصیص حافظه می تواند هم در پشته و هم در پشته رخ دهد. هنگامی که تابع جدید استفاده می شود، ممکن است یک بلوک از حافظه روی پشته یا پشته تخصیص داده شود. در مقابل، بلوک های حافظه ایجاد شده با استفاده از compose همیشه روی پشته تخصیص داده می شوند.

Go از تابع mmap سیستم عامل مانند TCMalloc (Thread-Caching Malloc) برای تخصیص حافظه روی پشته استفاده می کند. این برای مدیریت نیازهای حافظه بزرگ و پویا موثر است. علاوه بر این، Go از گوروتین هایی استفاده می کند که مجموعه های کوچک خود را حفظ می کنند و به عنوان حوضچه های حافظه برای بلوک های حافظه خاص عمل می کنند. حداکثر اندازه پشته در سیستم های 64 بیتی 1 گیگابایت و در سیستم های 32 بیتی 250 مگابایت است که از طریق عملکرد SetMaxStack قابل تنظیم است.

برای اطمینان از اجرای کارآمد برنامه، کامپایلر Go اغلب بلوک‌های حافظه را روی پشته اختصاص می‌دهد، که سپس توسط چندین گوروتین قابل دسترسی است. این کار مستلزم استفاده از جمع‌آوری زباله برای مدیریت و آزاد کردن حافظه بلااستفاده است. برای تجزیه و تحلیل تخصیص حافظه، از پرچم هایی مانند -gcflags -m می توان برای تعیین نحوه و مکان تخصیص حافظه استفاده کرد، از جمله تخصیص پشته به متغیرهای سطح بسته و اشاره گرهای ضمنی در منطقه حافظه جهانی.

چه زمانی یک بلوک حافظه در Go جمع آوری می شود؟

  1. متغیرهای حافظه اختصاص داده شده در سطح بسته هرگز جمع آوری نمی شوند.
  2. پشته Goroutine به طور خودکار (نه توسط جمع کننده زباله) در هنگام خروج جمع آوری می شود.
  3. جمع‌آوری زباله (GC) حافظه تخصیص‌یافته را در پشته جمع‌آوری می‌کند تنها در صورتی که به آن ارجاع داده نشده باشد، یعنی بلوک‌های حافظه استفاده نشده.

توجه: برای اصلاح او می رود Stack() برای روی هم گذاشتن گوروتین های ردیابی استفاده می شود.

چگونه کامپایلر بلوک های حافظه استفاده نشده را تشخیص می دهد؟

که در او می رودجمع آوری زباله (GC) در دو مرحله انجام می شود. اولی مرحله علامت گذاری و دومی مرحله اسکن است. GC از یک الگوریتم سه رنگ برای تجزیه و تحلیل استفاده از بلوک های حافظه استفاده می کند، تمام اشیاء خاکستری سراسری و انباشته را بازدید می کند، آنها را به رنگ سیاه علامت گذاری می کند و این روند تا جمع آوری آخرین شی خاکستری و در بلوک های حافظه در مرحله اسکن تکرار می شود.

زباله روب

Garbage Collector یا GC جدولی از هر حافظه اختصاص داده شده با تعداد مرجع نگهداری می کند. هنگامی که شمارش به صفر می رسد، شیء موجود در شمع با رنگ خاکستری مشخص می شود. می توانید اطمینان حاصل کنید که اشیاء در گروه سیاه حاوی اشاره گر به هیچ شی در گروه سفید نیستند. با این حال، نمی توان انکار کرد که شی جمع آوری سفید می تواند یک اشاره گر به شی جمع آوری سیاه داشته باشد زیرا این کار بر عملکرد جمع کننده زباله تأثیر نمی گذارد. این احتمال وجود دارد که اشیاء در گروه خاکستری دارای اشاره گر به برخی از اشیاء در گروه سفید باشند. در نهایت، اشیاء جمع آوری سفید کاندیدای جمع آوری زباله هستند.

زمانی که آستانه مشخص شده در متغیر محیطی GOGC برآورده شود، جمع کننده زباله شروع به کار می کند. با استفاده از SetGCPercent(زمان اجرا بسته/اشکال زدایی) تابع GOGC را می توان تنظیم کرد، پیش فرض GOGC=100، درصد منفی جمع آوری زباله را غیرفعال می کند.
اطلاعات زباله های اخیر با استفاده از GStats از طریق تابع GetGCStats جمع آوری می شود.

وقتی یک متغیر به پشته فرار می کند؟

وقتی یک متغیر به پشته فرار می کند؟وقتی یک متغیر به پشته فرار می کند؟

وقتی یک متغیر به پشته فرار می کند؟وقتی یک متغیر به پشته فرار می کند؟

در این زمینه، “escape to heap” نشان می دهد که در زمان اجرا به صورت پویا بر روی پشته تخصیص داده می شود زیرا به یک آرگومان تابعی منتقل شده است که خودش فرار می کند.

×1 از آنجا که به هیچ تابعی منتقل نمی شود، به پشته فرار نمی کند × 2 او به سمت توده فرار می کند.

برخی باعث فرار متغیرها به پشته می شوند:

  1. اشاره گرها یا مقادیر به عنوان آرگومان های تابع.
  2. ارسال نشانگرها یا مقادیر حاوی اشاره گر به کانال ها: کامپایلر AS نمی تواند تعیین کند که یک گوروتین چه زمانی داده ها را در کانال دریافت می کند و چه زمانی می تواند رایگان باشد.
  3. اشاره گرها در یک برش: برش ممکن است در پشته وجود داشته باشد اما داده های اشاره شده به سمت پشته می روند.
  4. آرایه های بخش: ممکن است دوباره تخصیص داده شوند زیرا append می تواند سرریز شود.
  5. روش های مربوط به نوع رابط: رابط در زمان اجرا نوع و مقدار را دریافت می کند.

اشکال زدایی در GO:

ما می توانیم از پرچم های ذکر شده در زیر برای رفع اشکال خطاهای حافظه Go استفاده کنیم:

  1. به ابزار ترجمه -S testigGC.go بروید
  2. به ایجاد -gcflags ‘-m -m’ testigGC.go بروید

یه چیز کوچیک

Google’s Go که در سال 2007 ایجاد شد، از یک منبع الهام برای مهندسان به زبان برنامه نویسی آزمایش شده در نبرد در پشت برخی از مهم ترین پروژه های بومی ابری در سراسر جهان به طور اساسی تکامل یافته است.

سادگی، عملکرد و مدل همزمانی قدرتمند آن، آن را برای طیف وسیعی از کاربردها ایده آل کرده است. درک مدیریت حافظه Go – از تخصیص تا جمع‌آوری زباله – استفاده بهینه و سودمند از منابع را تضمین می‌کند. چه یک مبتدی یا یک توسعه دهنده با تجربه باشید، تسلط بر این مفاهیم به شما کمک می کند تا نرم افزار قابل اعتماد و با کارایی بالا را با استفاده از Go ایجاد کنید. این وبلاگ یک نمای کلی جامع ارائه می دهد و بینش های عملی را برای تقویت مهارت های برنامه نویسی Go شما ارائه می دهد.

آیا سوالات بیشتری در مورد مدیریت حافظه Golang دارید؟

منبع: https://www.calsoftinc.com/blogs/golang-memory-management.html