אז מה קורה בזכרון כאשר אנחנו יוצרים אובייקט מסוג ReferenceType בזיכרון?
נניח ויש לנו אובייקט מסוג Student שמכיל מספר פונקציות ומספר משתנים.
לאחר שנבצע ()new Student , הייצוג של האובייקט בזיכרון יראה כך:
ועכשיו להסבר:
כשנאתחל את האובייקט - מכיוון שהוא מסוג ReferenceType ,יוקצה לו מקום על גבי ה GC Heap ויהיה לעברו מצביע (בציור הנ"ל המצביע הוא על גבי הStack, אך לא מן הנמנע שהמצביע יהיה על גבי ה GC Heap)
לכל אובייקט שנמצא על גבי ה GC Heap יש שני שדות שמתווספים אוטומטית לאובייקט (ושגודל של כל אחד מהם 4bytes) השדות הם:
מי שרוצה לרדת עוד יותר לעומק הדברים, מאמר מצוין נמצא כאן
תהנו!
נניח ויש לנו אובייקט מסוג Student שמכיל מספר פונקציות ומספר משתנים.
לאחר שנבצע ()new Student , הייצוג של האובייקט בזיכרון יראה כך:
ועכשיו להסבר:
כשנאתחל את האובייקט - מכיוון שהוא מסוג ReferenceType ,יוקצה לו מקום על גבי ה GC Heap ויהיה לעברו מצביע (בציור הנ"ל המצביע הוא על גבי הStack, אך לא מן הנמנע שהמצביע יהיה על גבי ה GC Heap)
לכל אובייקט שנמצא על גבי ה GC Heap יש שני שדות שמתווספים אוטומטית לאובייקט (ושגודל של כל אחד מהם 4bytes) השדות הם:
- Sync Block Index -SBI - מצביע לטבלת synchronisation הבנויה מ Sync Blocks. הטבלה מכילה את המידע האם בוצע על האובייקט lock או לא. כל פעם שמבוצע lock על האובייקט, נוצר Sync Block חדש שמכיל מידע אודות ה lock.
- Type Object Pointer - TOP- מצביע למקום שנקרא Method Table הנמצא על ה High Frequency Heap, המתאר את האובייקט. (ארחיב בהמשך)
High Frequency Heap- מקום על הHeap המכיל נתונים שניגשים אליהם בתדירות גבוהה. הוא לא מנוהל ע"י ה GC, הוא נוצר עם יצירת ה AppDomain, לכל AppDomain יש אחד כזה, ומטבע הדברים הוא מתנקה כאשר ה AppDomain "מת". דבר חשוב מאוד לדעת - כל המשתנים הסטטיים נמצאים על גבי ה High Frequency Heap, ומכאן שהם לא מתנקים ע"י ה GC..
Method Table - לפני שאנחנו יוצרים את ה Instance הראשון של האובייקט, כאשר כל ה Class וה Interface נטענים לראשונה ל AppDomain, נוצר על גבי ה High Frequency Heap ה Method Table, שמכיל את כל הנתונים על האובייקט, כמו: מאיזה type הוא, איזה פונקציות הוא מכיל (כולל כל ה ctor) ואת המשתנים הסטטיים.
מכאן הקומפיילר יודע איזה פונקציה האובייקט יפעיל (במקרים של הורשה למשל).
לדוגמא: אם ניצור אובייקט בלי שנדרוס את ToString, בMethod Table תופיע הפונקציה ToString שה MethodDescription שלו יהיה שייך למחלקה System.Object, ומכאן - כאשר האובייקט יפעיל את ToString, אז יופעל ה ToString הדיפולטי שהמחלקה שלנו יורשת ממנו (במקרה הנ"ל זה System.Object). אך אם ניצור אובייקט שכתבנו לו פונקציה שדורסת את ToString, אז ה MethodDescription שלנו יהיה שייך למחלקה שלנו (Student), וכאשר האובייקט יפעיל את ToString, אז יופעל ה ToString שאנחנו כתבנו..
מי שרוצה לרדת עוד יותר לעומק הדברים, מאמר מצוין נמצא כאן
תהנו!



