Вначале помните, что в куче будет также экземпляр Class
для вашего класса (и нескольких других).
Re:
## TestA obj =новый TestA ()
STACK - [взять немного памяти для основной функции -> здесь у нас есть b и ссылка на TestA]
HEAP - [взять немного памяти для int a]
a
будет в куче, а не в стеке, как часть памяти, выделенной для экземпляра TestA
.b
и obj
находятся в стеке, распределяются при входе в main
(э-э, я думаю, именно тогда это происходит; возможно, JVM не резервирует для них место в стеке, пока не встретит объявления впрограммный поток, но там мы попадаем во внутреннее пространство JVM).Куча также содержит экземпляр TestA
.(Помните, что obj
, переменная, совершенно отличается от того, на что она указывает [экземпляр TestA
]; каждая из этих вещей занимает память.)
Также помните, что в стеке будет возвращатьсяадреса для вызовов функций.Например, когда main
вызывает methodA
, адрес, к которому должна вернуться JVM при возврате methodA
, также находится в стеке.
Различные структуры стека также будут выделены для обработки исключений.
Вышесказанное в основном теоретическое, ум.JVM могут выполнять оптимизацию, и они это делают (HotSpot - это полностью оптимизирующая JVM).@Voo указывает, например, что JVM могут поместить объекты в стек, если обнаружат, что могут (например, когда экземпляр объекта используется только в методе, а анализ байт-кода JVM показывает, что там невозможнобыть выдающейся ссылкой на него при выходе из метода).