Скільки може рости стек?
Ви можете скористатися опцією VM з назвою, ss
щоб відрегулювати максимальний розмір стека. Опція VM зазвичай передається за допомогою -X {option}. Таким чином, ви можете використовувати java -Xss1M
для встановлення максимального розміру стека 1M.
Кожна нитка має принаймні один стек. Деякі віртуальні машини Java (JVM) поміщають стек Java (виклики методів Java) і власний стек (виклики власного методу у VM) в один стек і виконують розмотування стека за допомогою керованого до власного кадру, відомого як M2NFrame. Деякі JVM тримають два стеки окремо. У Xss
більшості випадків встановлюється розмір стеку Java.
Для багатьох JVM вони встановлюють різні значення за замовчуванням для розміру стека на різних платформах.
Чи можемо ми обмежити це зростання?
Коли відбувається виклик методу, на стеку цього потоку буде створений новий кадр стека. Стек буде містити локальні змінні, параметри, адресу повернення тощо. У Java ви ніколи не можете помістити об'єкт у стек, у стеку може зберігатися лише посилання на об'єкт. Оскільки масив також є об'єктом у Java, масиви також не зберігаються в стеку. Отже, якщо ви зменшите кількість локальних примітивних змінних, параметрів, згрупувавши їх в об'єкти, ви зможете зменшити простір у стеку. Насправді той факт, що ми не можемо явно помістити об'єкти в стек Java, впливає на продуктивність деякий час (промах кешу).
Чи має стек якесь мінімальне значення за замовчуванням чи максимальне значення за замовчуванням?
Як я вже говорив раніше, різні віртуальні машини відрізняються і можуть змінюватися залежно від версії. Дивіться тут .
як працює збирання сміття у стеку?
Збір сміття на Java - гаряча тема. Вивіз сміття має на меті збирати недоступні предмети в купі . Тож для цього потрібне визначення поняття „досяжний”. Все, що знаходиться в стеку, є частиною посилань на кореневий набір у GC. Все, до чого можна дістатись із кожного стека кожного потоку, слід розглядати як живе. Є деякі інші посилання на кореневі набори, такі як об’єкти Thread та деякі об’єкти класу.
Це лише дуже туманне використання стека на GC. В даний час більшість JVM використовують поколінні ГХ. У цій статті подано короткий вступ про Java GC. А нещодавно я прочитав дуже гарну статтю, яка розповідає про GC на .net. GC на oracle jvm досить схожий, тому я думаю, що це також може вам допомогти.