<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های حامت قلیزاده</title>
        <link>https://virgool.io/feed/@hamet</link>
        <description>گاه نوشته های حامت ق - https://imber.live</description>
        <language>fa</language>
        <pubDate>2026-06-10 12:46:23</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/3069/avatar/qwb17S.png?height=120&amp;width=120</url>
            <title>حامت قلیزاده</title>
            <link>https://virgool.io/@hamet</link>
        </image>

                    <item>
                <title>مموری لیک، کابوس هر برنامه نویس! (قسمت دوم)</title>
                <link>https://virgool.io/@hamet/%D9%85%D9%85%D9%88%D8%B1%DB%8C-%D9%84%DB%8C%DA%A9-%DA%A9%D8%A7%D8%A8%D9%88%D8%B3-%D9%87%D8%B1-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3-%D9%82%D8%B3%D9%85%D8%AA-%D8%AF%D9%88%D9%85-m1akffpj2fgl</link>
                <description>در قسمت قبلی یاد گرفتیم چطور میتوان فهمید که پروسس اپ‌مان مموری لیک دارد یا نه؟ خب حالا که مثل لوله کشان کاور پست‌مان فهمیدیم که پروسس‍مان مموری لیک دارد، چکار باید کنیم؟نشتی از کجاست؟خب، قبل از اینکه خودمان را درگیر دیباگر نود جی اس کنیم، ابتدا مواردی که ممکن است باعث مموری لیک اپلیکیشن‌مان شود را حدس بزنیم:استفاده از ورژن‌های قدیمی نود‌جی‌اس (دریافت آخرین ورژن)استفاده از ماژول‎های قدیمی یا تست نشده!بکارگیری توابع ناخالص (بیشتر در ادامه توضیح دادم)اجرا کردن اپ با پروسس منیجر‎های غیراستاندارد یا نسخه قدیمی آن‎ها ( پیشنهاد من آخرین ورژن pm2)پروسس‎های بلاک شده!و هزاران دلیل دیگربکارگیری توابع ناخالص (impure)این توابع همان تابع‌های ساده‌ی خودمون هستند ولی با فرق اینکه یک سری نکات رو رعایت کنیم بهش میگن pure و در غیر اینصورت تابع impure نامیده میشود.تابع خالص چیست: تابعی که با توجه به ورودی‏‌های داده شده همیشه همان خروجی را برمی‌گرداند. این توابع به هیچ متغیر یا حالت خارج از تابع بستگی ندارد و فقط تغییر در ورودی باعث تغییر در خروجی میشود.تابعی که هیچ عوارض جانبی قابل مشاهده مثل تغییر داده (متغیر)، ارسال درخواست شبکه و ارسال درخواست به دستگاه‎‎های ورودی و خروجی ندارد.تابع نا‌خالص چیست: توابعی که شروط بالا رو رعایت نکنند، ناخالص‌ند :)مثال تابع خالص: function priceAfterTax(productPrice) {
    return (productPrice * 0.20) + productPrice;
}مثال تابع ناخالص: var tax = 20;
function calculateTax(productPrice) {
    return (productPrice * (tax/100)) + productPrice; 
}برای اطلاعات بیشتر در مورد این نوع توابع این مقاله رو مطالعه کنید.پروسس‎های بلاک شده!شاید دلیل اصلی بسیاری از توسعه‌دهندگانی که از نود استفاده می‏‎کنند همین تکنولوژی non-blocking باشه، که میتوان گفت یکی از شاهکار‏های نود میباشد. اما خب برای توسعه دهندگانی که به‌تازگی با نود آشنا شدند درک مفهوم آن ممکن است سخت باشد. از آنجا که نمیخوام این بحث را سخت‎ترش کنم با یک مثال ساده شرح میدم:  Blocking I/Olet data = db.users.find(very slow query) // stopped here by await OR yield 
console.log(data)
console.log(&#039;im waiting for database and it is not good&#039;) در این روش متد find تا زمانی که کوئری به صورت کامل اجرا نشده و خروجی را به متغیر data انتقال نداده بقیه کد‎ها با اینکه به خروجی این کوئری احتیاجی ندارند بلاک شده و اجرا نخواهند شدNon-Blocking I/Odb.users.find(very slow query, callback(data) {
    console.log(data)
})
console.log(&#039; i not waiting for database and it is awesome&#039;)یکی از بهترین روش‏‎ها برای بهره مندی از امکان non-blocking نود‌جی‌اس همین استفاده از توابع برگشتی و Promise ها است، که در این تکه کد به آن اشاره شد.سعی کنید تا میتوانید از non-blocking ها استفاده کنید و با استفاده از توابع برگشتی و یا Promise ها کارایی اپ نود‌جی‌استان رو بالا ببریدکار با دیباگر! اگر روش‌های مختلفی را امتحان کردید اما مموری لیک پروسس شما از بین نرفت. پس تنها یک راه نهایی مانده تا بفهمید مشکل از کجاست. قبل از اینکه کارو شروع کنید ابتدا با چند اصطلاح آشنا بشیم. هیپ‎دامپ (Heapdump)یک ابزار عالی برای گرفتن اسنپ شات از پشته (heap) است، که بعدا می‌توانید توسط اینسپکتور (inspector) گوگل کروم آن را آنالیز کنید.اینسپکتور نود (Node-inspector)این ابزار به شما اجازه میده که به پروسس نود‌جی‌اس در حال اجرا وصل شده و اسنپ شات هیپ گرفته و یا کدهای پروسستان را ویرایش کرده و دیباگ کنید ( بدون  نیاز به ریستارت پروسس)شروع کار با نود اینسپکتوربرای اینکه بتوانیم مموری لیک را لمس کنیم و نود اینسپکتور را در عمل مشاهده کنیم یک اپ کوچکی با فریم ورک اکسپرس نوشتم ولی با این تفاوت که این اپ کوچک دارای مموری لیک است!memoryLeak.js: const express = require(&#039;express&#039;)
const app = express()
const port = 6363

let globalArray = [];app.get(&#039;/&#039;, (req, res) =&gt; {    globalArray.push(function thisIsTestFunc() {
        return req.headers;
     })
     return res.send(&#039;hi, this is memory leak!&#039;)
})

app.listen(port)
console.log(&#039;process is running on port: &#039;, port)این تکه کد یک اپلیکیشن نود‌جی‌اس ساده هست که به ازای هر درخواست به آدرس &#x27;/&#x27; یک شی (Object) به آرایه گلوبال اضافه کرده و یک پاسخ به کاربر میدهد. مشکلی که وجود دارد این است که این آرایه گلوبال در مدت زمان کم (نسبت به تعداد درخواست) شروع به افزایش حجم مموری نموده و هیچ گاه خالی نمیشود، تا اینکه پروسس نودمان کرش کند!برای اجرای پروسسمان در حالت دیباگر به این صورت اقدام می‌کنیم:node --inspect memoryleak.jsبعد از اجرای پروسسمان، آدرس زیر را در مرورگر باز میکنیم:http://localhost:9229/json/listکه در این صفحه یک خروجی JSON چاپ شده که شامل اطلاعات زیر است: مقدار مشخصه devtoolsFrontendUrl را در مرورگر گوگل کروم باز میکنیم و وارد دیباگر نود اینسپکتور میشویم!حتما از مرورگر گوگل کروم استفاده کنید زیرا این آدرس در مرورگر‌‌های دیگر کار نخواهد کرد. برای امنیت بیشتر  بعد از اینکه وارد دیباگر شدید، دیگر آدرس http://localhost:9229/json/list به شما خروجی جدید نخواهد داد!به تب profile &#40;در ورژن های جدید به نام memory تغییر یافته&#41; دیباگر رفته و گزینه &quot;allocation insurance on timeline&quot; انتخاب کرده و سپس start را میزنیم با استفاده از شبیه سازهای آماده تعدادی درخواست HTTP به سمت پروسس نودمان هدایت میکنیم، به محض اینکه درخواست‌ ها به پروسس نود‌مان رسید می‍توانیم تغییرات آبی رنگی را در نمودار افقی مشاهده کنیم بعد از گذشت 3 دقیقه تایم لاین را متوقف میکنیم و بازه های کوچکی را انتخاب کرده و مورد آنالیز قرار میدهیم. از آنجایی که این مموری لیک کاملا توسط خودمان ایجاد شده بود پس پیدا کردن آن بین این همه شی، آرایه و رشته کار چندان سختی نیست :) مستقیم به قسمت closure رفته و فاجعه را مشاهده میکنیم!!!تعداد بسیار زیادی از تابع thisIsTestFunc تکرار شده است، اگر یادتان نباشد این تابع کارش این بود که شی req.headers رو به داخل آرایه گلوبال اضافه میکرد; اگر این اضافه کردن‌ها به مدت بیشتری ادامه پیدا کند ممکن است رم بیشتری را اشغال کرده و در نهایت منجر به کرش اپ نود‍مان شود پس برای جلوگیری از این کار بعد از اینکه کارمان با آرایه گلوبال تمام شد مقدار آن را خالی میکنیم....
app.get(&#039;/&#039;, (req, res) =&gt; {
   globalArray.push(function thisIsTestFunc() {
          return req.headers;
    })
    
  // do some stuff 
  globalArray = []
 
  return res.send(&#039;hi, this is memory leak!&#039;)
})
...این یک مثال بسیار ساده از مموری لیک بود، لزوما مموری لیک ها به این سادگی از بین نمیروند، نیاز به تحلیل و آنالیز بیشتر heapdump ها دارند، برای اینکه مموری لیک را بیابید سعی کنید در بازه های زمانی مختلف heapdump گرفته و آنها را باهم مقایسه کنید و یا در یک بازه چندین heapdump گرفته و آنها را مورد بررسی قرار دهید. یادگیری بیشتربرای بیشتر یاد گرفتن، مقاله های زیر را پیشنهاد میکنم:مفهوم GC ها در نود‌جی‌اسبرنامه نویسی Async در نود‌جی‌اسجزئیات بیشتر کار با دیباگر و هیپ دامپنتیجه گیری از اینکه اپ نود‌جی‌استان مموری لیک دارد خجالت نکشید; جستجو کنید، پشتکار داشته باشید و به تحلیل و بررسی ادامه دهید که تنها راه نابودی مموری لیک، وقت گرانبهای شماست! اگر پیشنهادی، انتقادی و یا خطایی در صحبت هام بود ممنون میشم از قسمت کامنت‎ها یا توییتر من رو در جریان بگذارید ♥</description>
                <category>حامت قلیزاده</category>
                <author>حامت قلیزاده</author>
                <pubDate>Wed, 28 Nov 2018 14:07:56 +0330</pubDate>
            </item>
                    <item>
                <title>مموری لیک، کابوس هر برنامه نویس! (قسمت اول)</title>
                <link>https://virgool.io/@hamet/memory-leak-in-nodejs-applications-rcrjf4chj3iz</link>
                <description>یک عدد لیک در دنیای واقعی :)لوله کش نیمه حرفه ای یا مبتدی دارد شیر آب ظرف شویی شما را با اعتماد به نفس کامل تعمیر میکند و به محض اینکه کارش را تمام کرد، میگوید: &quot;خانم این شیری که من برای شما تعمیر کردم، تا عمر دارین براتون کار میکنه، بدون کوچک ترین نشتی..!&quot; پایش را از خانه که بیرون میگذارد آب با فشار تمام خانم محترم را سر تا پا خیس میکند. خوشبختانه یا بدبختانه ما برنامه نویس ها هم از این قافله عقب نماندیم، به نمونه جانور زیر دقت کنید:خب به سلامتی نسخه بتا رو تموم کردیم و همه چی به خوبی و خوشی  در محیط دولوپ و تست کار میکنه و مشکلی نداریم وقتشه بزنیم رو پروداکشن و قراره بترکونیم..!این ها خیالات خام یک برنامه نویس هست که برای بار اول میخواهد پروداکشن را تجربه کند..! معمولا پروداکشن خطرناک تر از آن چیزی هست که در ظاهر نشان میدهد. برای برنامه ای که مموری لیک دارد، در بهترین حالت اگر در اولین اجرا خطایی رخ ندهد به مرور زمان باعث میشود مموری (RAM) سرور را پر کند.در این مقاله قصد دارم راه هایی که برای حل مشکل مموری لیک در برنامه نود جی اس انجام دادیم را معرفی کنم. مموری لیک چیست؟مموری لیک به حالتی از پروسس در حال اجرا گفته میشود که به مرور زمان مموری بیشتری را اشغال میکند و این عمل تا زمانی ادامه خواهد داشت که به اندازه مقدار پارامتر --max-old-space-size برسد، در صورتی که از ابزاری برای مدیریت پروسس هایتان همانند pm2 یا forever استفاده کنید، پروسس شما را ریستارت خواهد کرد (هر ریستارت برابر یک مشتری کمتر و یک مشتری ناراضی)سوال: پروسس من، رم بسیار بالایی اشغال کرده هست، اما در یک مقدار ثابت در بازه زمانی بسیار طولانی قرار گرفته، آیا برنامه من نیز دارای مموری لیک هست؟ خیر!شناسایی مموری لیکماژول next-memwatch : شاید اولین نتیجه ای که گوگل برای شما پیشنهاد خواهد کرد این ماژول هست.  بهترین ماژولی که بتوان گفت برنامه یا پروسس ما دارای مموری لیک هست یا نه next-memwatch هست، برای استفاده از این ماژول کافیست مراحل زیر را انجام دهید:اضافه کردن ماژول به برنامهconst memwatch = require(&#039;memwatch-next&#039;);و گوش دادن به رویداد نشت (ترجمه بعضی کلمات تخصصی انگلیسی به فارسی همانند کشیدن ناخن روی تخته سیاه هست..)memwatch.on(&#039;leak&#039;, (info) =&gt; {
  console.error(&#039;Memory leak detected:\n&#039;, info);
});خب کافیست برنامه تان را استارت کنید در صورتی که پیام زیر را در خروجی مشاهده کردید، تبریک میگویم، بدبخت شدید برنامه شما مموری لیک دارد (مزاح کردم زیاد هم بدبخت نشدید)Memory leak detected:
{
  growth: 14280616,
  reason: &#039;heap growth over 5 consecutive GCs (3s) - -2147483648 bytes/hr&#039;
}هر زمانی که برنامه شما مموری لیک داشته باشد رویداد نشت(leak) اجرا خواهد شد. خب تا اینجا فهمیدیم که برنامه ما مموری لیک دارد ولی چطور میتوان این مشکل بزرگ را حل کرد. در قسمت دوم قرار هست باهم از ابزاری هایی استفاده کنیم که این معضل را به طور کلی ریشه کن کنیم. پس با من همراه باشید. </description>
                <category>حامت قلیزاده</category>
                <author>حامت قلیزاده</author>
                <pubDate>Thu, 25 Jan 2018 23:08:36 +0330</pubDate>
            </item>
            </channel>
</rss>