Я только что обнаружил, что есть некоторые библиотеки для вычисления мелкого размера Java-объекта, поэтому я подумал, что я также могу написать это очень простым способом.Вот что я попробовал.
- Запустите программу с
Xmx
скажем A
- Создайте объекты типа, размер которого вы хотите вычислить (скажем, типа
T
)и сохраните их в списке, чтобы GC не мог их очистить. - Когда мы нажмем OOM, пусть код обработает его и очистит список.
- Теперь проверьте количество объектовтипа
T
мы выделили.Пусть это будет n
- Выполните бинарный поиск, чтобы определить дельта-порядок для успешного выделения
n+1
объектов.
Вот код, который я опробовал
import java.util.ArrayList;
public class test {
public static void main(String[] a) {
ArrayList<Integer> l = new ArrayList<>();
int i=0;
try {
while(true) {
l.add(new Integer(1));
i++;
}
} catch(Throwable e) {
} finally {
l.clear();
System.out.println(i + "");
}
}
}
Но я заметил, что количество объектов, выделенных в каждом прогоне для одного и того же Xmx
, варьировалось.Почему это?Есть ли что-нибудь внутри рандомизированной JVM?