דילוג לתוכן
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. איסוף זבל על משתנה שלכודה ב-closure ב-JS/V8 - שאלה

איסוף זבל על משתנה שלכודה ב-closure ב-JS/V8 - שאלה

מתוזמן נעוץ נעול הועבר תכנות
10 פוסטים 3 כותבים 164 צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • yossizY מנותק
    yossizY מנותק
    yossiz
    כתב ב נערך לאחרונה על ידי yossiz
    #1

    אתמול התעוררתי לגבי שאלה זו, ואולי התשובה תעזור לבעיית @מנצפך כאן.

    נגיד שיש לנו קוד כזה:

    function () {
      let a = {};
      setInterval(() => {}, 1000)
    }
    

    מתי אובייקט a הולך לפח הזבל?
    צדדי השאלה:

    • מצד אחד, אחרי שאף אחד לא ישתמש באובייקט הזה אחרי הרצת הפונקציה, ניתן לזרוק אותו לפח מיד בסוף הפונקציה.
    • מצד שני, זה חוקי לפונקציה האנונימית שהעברתי ל-setInterval לגשת אל a, ובשפה אחרת a נמצאת עכשיו בתוך closure.

    האם אוסף הזבל של V8 מספיק חכם לדעת שהפונקציה לא הולכת להשתמש במשתנה או לא?

    📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

    מנצפךמ תגובה 1 תגובה אחרונה
    1
    • מנצפךמ מנותק
      מנצפךמ מנותק
      מנצפך
      השיב לyossiz ב נערך לאחרונה על ידי
      #2

      @yossiz
      אני חושב שהוא ישאר בזיכרון.
      לדעתי הטיימר משאיר את כל מה שיש לו גישה בזיכרון.

      yossizY תגובה 1 תגובה אחרונה
      -1
      • yossizY מנותק
        yossizY מנותק
        yossiz
        השיב למנצפך ב נערך לאחרונה על ידי yossiz
        #3

        @מנצפך ראיתי עכשיו תשובה זו (ועוד כמה: [1], [2]) שטוענות שהוא לא יישאר בזכרון אם המנוע מצליח לזהות שהוא לא בשימוש על ידי הפונקציה הפנימית.

        עריכה: הוא לא יישאר בזכרון אם המנוע מצליח לזהות שהוא לא בשימוש על ידי אף אחד מהפונקציהות הפנימיות

        עיין כאן: https://stackoverflow.com/questions/19798803

        @מנצפך האם בדקת שזה לא מה שגורם לניפוח הזיכרון בתוכנה שלך?

        📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

        מנצפךמ תגובה 1 תגובה אחרונה
        5
        • מנצפךמ מנותק
          מנצפךמ מנותק
          מנצפך
          השיב לyossiz ב נערך לאחרונה על ידי
          #4

          @yossiz אין אצלי שום טיימרים.

          yossizY תגובה 1 תגובה אחרונה
          0
          • yossizY מנותק
            yossizY מנותק
            yossiz
            השיב למנצפך ב נערך לאחרונה על ידי
            #5

            @מנצפך זה לא קשור דוקא לטיימרים. כל פונקציה פנימית יוצרת closure. אם נשאר מצביע לפונקציה זו בשום מקום, זה מונע מהמנוע לאסוף לפח הזבל את כל מה שה-closure מצביע עליו.

            📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

            מנצפךמ תגובה 1 תגובה אחרונה
            2
            • מנצפךמ מנותק
              מנצפךמ מנותק
              מנצפך
              השיב לyossiz ב נערך לאחרונה על ידי
              #6

              @yossiz לגבי המקרה שלי, אני לא מאמין שיש שם באמת memory leak
              כי אם כך כל הזמן הזיכרון היה מתנפח.
              אצלי זה קורה מידי פעם (בשעות עומס כמובן). וההתנהגות היא של קפיצה בזיכרון ואז שחרור למצב רגיל. מה שמוביל אותי למסקנה שזה פשוט ה - GC שלוקח לו זמן להיכנס לפעולה (הוא הרי לא עובד כל הזמן).

              אני מנסה לפתור את זה בדרכים חלופיות, ע"י חלוקת עומסים.

              למעשה, הספק מנקר בי כל הזמן האם זה בעית הזיכרון מצויה ב NodeJS יותר מאשר בשפה אחרת. בוודאי שצריך למצוא את הספריות הנכונות לעבוד איתן.

              yossizY מנצפךמ 2 תגובות תגובה אחרונה
              0
              • yossizY מנותק
                yossizY מנותק
                yossiz
                השיב למנצפך ב נערך לאחרונה על ידי yossiz
                #7

                @מנצפך יכול להיות שאין leak של ממש, ובכל זאת יכול להיות אתה שומר על אובייקטים בזכרון יותר זמן ממה שצריך.

                📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

                מנצפךמ תגובה 1 תגובה אחרונה
                1
                • מנצפךמ מנותק
                  מנצפךמ מנותק
                  מנצפך
                  השיב למנצפך ב נערך לאחרונה על ידי
                  #8

                  לגבי מה שכתבת,
                  בפונקציה שאני חושד בה בעיקר, יש גישה לDB עם await
                  שזה בעצם יוצר פונקציה פנימית. אבל אין שום גישה לאף קוד חיצוני לפונקציה הזו.

                  אני מסתפק האם יש להציב בסוף הפוקנציה null לכל המערכים שאיתם עבדתי.
                  בכל מקרה אני מצהיר על המערכים עם let. זה אומר שהם בוודאי לא זמינים החוצה.
                  ייתכן של GC יותר מובן אם אני מציב null?
                  אבדוק את זה.

                  תגובה 1 תגובה אחרונה
                  0
                  • מנצפךמ מנותק
                    מנצפךמ מנותק
                    מנצפך
                    השיב לyossiz ב נערך לאחרונה על ידי
                    #9

                    @yossiz
                    אם אני כותב ככה

                    let a=['A'];
                    a=a[0];
                    

                    זה יכול לגרום לאיזושהי בעיה?

                    וסתם באופן כללי בלי מערך:

                    let a='A';
                    a='B';
                    

                    יכול לגרום לאיזושהי בעיית זיכרון?

                    האם עדיף לכתוב כך:

                    let a=['A'];
                    let b=a[0];
                    
                    dovidD תגובה 1 תגובה אחרונה
                    0
                    • dovidD מנותק
                      dovidD מנותק
                      dovid ניהול
                      השיב למנצפך ב נערך לאחרונה על ידי
                      #10

                      @מנצפך אין שום בעיה.

                      מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                      בכל נושא אפשר ליצור קשר dovid@tchumim.com

                      תגובה 1 תגובה אחרונה
                      3

                      בא תתחבר לדף היומי!
                      • התחברות

                      • אין לך חשבון עדיין? הרשמה

                      • התחברו או הירשמו כדי לחפש.
                      • פוסט ראשון
                        פוסט אחרון
                      0
                      • דף הבית
                      • קטגוריות
                      • פוסטים אחרונים
                      • משתמשים
                      • חיפוש
                      • חוקי הפורום