среда, 1 августа 2012 г.

memory: thread stack

При старте каждого потока (Thread) виртуальная машина выделяет ему область памяти называемую "стек". Отсюда происходят:
- stack trace
- StackOverflowException
- "срыв стека" (ошибка, используемая хакерами для исполнения своего кода на чужой машине)

"Измеряем" размер стека, выделенного на один поток по умолччанию
public class StackMeter {
    static int counter0 = 0;
    static int counter10 = 0;

    public static void main(String[] args) {
        try {
            test0();
        } catch (StackOverflowError ignore) {}
        System.out.println(counter0);
        try {
            test10();
        } catch (StackOverflowError ignore) {}
        System.out.println(counter10);
    }

    private static void test0() {
        counter0++;
        test0();
    }

    private static void test10() {
        long L0 = 0; long L1 = 0; long L2 = 0; 
        long L3 = 0; long L4 = 0; long L5 = 0;
        long L6 = 0; long L7 = 0; long L8 = 0; 
        counter10++;
        test10();
    }
}
>> 12532
>> 4494