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

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

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

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

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

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

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

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

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

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

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

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

    מנצפךמ תגובה 1 תגובה אחרונה
    1
    • yossizY yossiz

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

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

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

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

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

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

      מנצפךמ מנותק
      מנצפךמ מנותק
      מנצפך
      כתב ב נערך לאחרונה על ידי
      #2

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

      yossizY תגובה 1 תגובה אחרונה
      -1
      • מנצפךמ מנצפך

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

        yossizY מנותק
        yossizY מנותק
        yossiz
        כתב ב נערך לאחרונה על ידי yossiz
        #3

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

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

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

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

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

        מנצפךמ תגובה 1 תגובה אחרונה
        5
        • yossizY yossiz

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

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

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

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

          מנצפךמ מנותק
          מנצפךמ מנותק
          מנצפך
          כתב ב נערך לאחרונה על ידי
          #4

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

          yossizY תגובה 1 תגובה אחרונה
          0
          • מנצפךמ מנצפך

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

            yossizY מנותק
            yossizY מנותק
            yossiz
            כתב ב נערך לאחרונה על ידי
            #5

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

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

            מנצפךמ תגובה 1 תגובה אחרונה
            2
            • yossizY yossiz

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

              מנצפךמ מנותק
              מנצפךמ מנותק
              מנצפך
              כתב ב נערך לאחרונה על ידי
              #6

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

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

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

              yossizY מנצפךמ 2 תגובות תגובה אחרונה
              0
              • מנצפךמ מנצפך

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

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

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

                yossizY מנותק
                yossizY מנותק
                yossiz
                כתב ב נערך לאחרונה על ידי yossiz
                #7

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

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

                מנצפךמ תגובה 1 תגובה אחרונה
                1
                • מנצפךמ מנצפך

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

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

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

                  מנצפךמ מנותק
                  מנצפךמ מנותק
                  מנצפך
                  כתב ב נערך לאחרונה על ידי
                  #8

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

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

                  תגובה 1 תגובה אחרונה
                  0
                  • yossizY yossiz

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

                    מנצפךמ מנותק
                    מנצפךמ מנותק
                    מנצפך
                    כתב ב נערך לאחרונה על ידי
                    #9

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

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

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

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

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

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

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

                    let a=['A'];
                    let b=a[0];
                    
                    dovidD תגובה 1 תגובה אחרונה
                    0
                    • מנצפךמ מנצפך

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

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

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

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

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

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

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

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

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

                      • מנטור אישי בתכנות והמסתעף – להתקדם לשלב הבא!
                      • בכל נושא אפשר ליצור קשר dovid@tchumim.com
                      תגובה 1 תגובה אחרונה
                      3
                      תגובה
                      • תגובה כנושא
                      התחברו כדי לפרסם תגובה
                      • מהישן לחדש
                      • מהחדש לישן
                      • הכי הרבה הצבעות


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

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

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