J2me сборщик мусора
От: bit5  
Дата: 18.10.05 08:41
Оценка:
Привет всем!

Накидал я тест для проверки работы сборщика мусора.
Если запустить так — то будет все нормально вечный цикл будет постоянно заполнять вектор.
Но если закоментировать метод destroy — то произойдет Out Of Memory.

if (i == 18000) { — 18000 возможно прийдеться подобрать вручную (это на моем эмуле хватило столько записей — чтобы заполнить память, возможно на других будет heap меньше)

Следовательно — можно пойти двумя дорогами:
1. всегда нужно очищать все глобальные ссылки в экземплярах классов (метод destroy). Только глобальные, так как объекты, которые созданые только в методе — память за ними будет очищена после работы метода. Очищать нужно в том числе и int a; => a=null; иначе память все равно останется не доступной
2. принять правило — всегда обнулять ненужные ссылки.

ИМХО — 2 ой вариант более геморный — так как запаришся всегда за собой убирать %))

!
в связи с этим вопрос: действительно ли мусорщик убирает всегда (если ссылки на объект не глобальные) после отработки метода или это может происходить не всегда — и нужно всетаки принудильно обнулять ссылки локальные в методе.

?????


код:

import javax.microedition.midlet.MIDlet;
import javax.microedition.lcdui.*;
import java.util.Vector;

public class Test2
extends MIDlet {

private static Vector v = new Vector();

public void startApp() {
Form form = new Form("Test");
Display.getDisplay(this).setCurrent(form);

System.out.println("Total memory: " + Runtime.getRuntime().totalMemory());
System.out.println("Free memory: " + Runtime.getRuntime().freeMemory());
Test3 test3 = new Test3();
System.out.println("Total memory: " + Runtime.getRuntime().totalMemory());
System.out.println("Free memory: " + Runtime.getRuntime().freeMemory());

test3.destroy();
test3 = null;

while (true) {
test();
System.out.println("Total memory: " + Runtime.getRuntime().totalMemory());
System.out.println("Free memory: " + Runtime.getRuntime().freeMemory());
}
}

public void pauseApp() {

}

public void destroyApp(boolean destroy) {
}

public void test() {
Vector v = new Vector();
int i = 0;
while (true) {
if (i == 18000) {
break;
}
v.addElement(new Integer(i));
i++;
}
}
}




import java.util.Vector;

public class Test3 {
private static Vector v = new Vector();

public Test3() {
test();
}

public void test() {
int i = 0;
while (true) {
if (i == 18000) {
break;
}
v.addElement(new Integer(i));
i++;
}
}

public void destroy() {
v = null;
}
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.