שאלה ב-JAVA על gc, seralization

_alon_

New member
שאלה ב-JAVA על gc, seralization

שלום, כתבתי אפליקציה ששולחת אוביקטים דרך socket. הזכרון של האפליקציה מטפס בצורה מדהימה ביחס ישר לגודל האוביקט שאני מעביר. כדי לפתור את הבעיה נסיתי לקרוא את האוביקט ואז את המשתנה שמחזיק אותו להשוות ל-null. כמו כן קראתי ל-System.gc אך ללא הועיל. עוד דבר מוזר הוא שהמשתנה שמחזיק את האוביקט הנקרא הוא משתנה מקומי בפונקציה שנקראת כל פעם מחדש, כך שהוא מת ואין אף אחד שמצביע עליו בסוף הפונקציה. יותר מזה הוספתי לאוביקט שאני מעביר finalization ששולח משהו להדפסה. כל ההדפסות מגיעות רק שאני עוצר את התוכנית! בתוכנית סתמית שלא משתמשת ב-serialization להעביר אוביקטים דרך socket ה- gc נראה עובד נהדר. מדוע? למה? ואיך ניתן לקרוא ל-gc לעבוד הרגע??? הצעות?
 

philips

New member
המממ..בעייה מעניינת...

כעיקרון מה שאתה מבקש לבצע הוא די בסיסי ולפיכך כמה דברים יתכנו. מכיון שה GC אמור לפעול לבדו במצב זה , ומכיון שהוא לא פועל לבדו וגם לא כשאתה מפעילו ידנית.... אכן בעייה...
הייתי מציע לך 2 דברים. אחד: בדוק את הקוד וקרא טוב טוב לגבי ה STREAM שאתה שולח אליהם אולי יש שם איזהשהוא פרמטר/CATCH קטן שמחזיק את האובייקט בחיים... שניים: בדוק בתיעוד של JAVA לגבי באגים ב API הספציפי שאתה משתמש בו. שלוש: כמה ל JAVARANCH FORUM ושאל שם שאלה ספציפית וצרף את הקוד.. בטוחני שתקבל שם תשובה ממייסדי השפה/אנשים שנתקלו בבעיות כאלו בעבר. קצת קשה לייעץ מבלי לראות את הקוד ואני חושב שעצותיי יעזרו לך...
 

albanetc

New member
finalization

עד כמה שזכור לי, מנגנון ה-FINALIZATION פועל כאשר אף אחד לא משתמש ב-OBJECT. לצורך בירור אם יש שימוש או לא, ב-JVM משתמשים ב-REFERENCE COUNTER. לדעתי אתה לא משחרר את כל ה-REFERENCES לאותם אובייקטים שאתה יוצר, ולכן ה-GC לא ימחק אותם, בין אם יופעל אוטומטית ובין אם ידנית. והנושא (לדעתי) כלל לא קשור ל-SERIALIZATION או SOCKETS. מה שאני הייתי עושה לו הייתי במקומך זה - לככב קטעי קוד שונים ולראות כיצד זה משפיע על זיכרון.
 
למעלה