Вопрос:

Где создан объект Thread? Стек или куча?

java multithreading concurrency

8099 просмотра

3 ответа

95 Репутация автора

Когда я говорю что-то вроде:

Thread t1 = new Thread();

это создает это в куче или стеке?

Автор: Chiran Источник Размещён: 17.10.2013 05:38

Ответы (3)


11 плюса

724872 Репутация автора

В Java нет способа разместить объекты в стеке.
Стек может содержать только ссылки и примитивы, и только для локальных переменных.

Обратите внимание, что запуск потока создаст новый стек для этого потока.

Автор: SLaks Размещён: 17.10.2013 05:39

9 плюса

10050 Репутация автора

Решение
Thread t1 = new Thread();

Это распределяет объект, т.е. t1 в куче.

По мере появления каждого нового потока он получает свой собственный регистр компьютера (счетчик программ) и стек Java. Если поток выполняет метод Java (не собственный метод), значение регистра pc указывает следующую команду для выполнения. Стек Java потока хранит состояние вызовов метода Java (не собственного) для потока. Состояние вызова метода Java включает its local variables, the parameters with which it was invoked, its return value(если есть) and intermediate calculations,. Состояние вызовов собственных методов сохраняется зависящим от реализации способом в стеках собственных методов, а также, возможно, в регистрах или других зависимых от реализации областях памяти.

Стек Java состоит из кадров стека (или кадров). Кадр стека содержит состояние одного вызова метода Java. Когда поток вызывает метод, виртуальная машина Java помещает новый кадр в стек Java этого потока. Когда метод завершается, виртуальная машина открывает и отбрасывает фрейм для этого метода.

Виртуальная машина Java не имеет регистров для хранения промежуточных значений данных. Набор команд использует стек Java для хранения промежуточных значений данных.

На рисунке показан снимок экземпляра виртуальной машины, в котором выполняются три потока. В момент снэпшота потоки один и два выполняют методы Java. Третий поток выполняет собственный метод. Он также показывает области памяти, которые виртуальная машина Java создает для каждого потока, эти области являются частными для потока-владельца. Никакой поток не может получить доступ к регистру компьютера или стеку Java другого потока.

введите описание изображения здесь

Автор: Trying Размещён: 17.10.2013 06:03

2 плюса

463353 Репутация автора

В Java 8 с помощью объектов Escape Analysis можно создавать в стеке. Это происходит, когда объект обнаруживается как не выходящий из текущего метода (после выполнения встраивания). Примечание: эта оптимизация доступна в Java 7, но я не думаю, что она работала также хорошо.

Однако, как только вы вызовете start()его, он выйдет из текущего метода, поэтому он должен быть помещен в кучу.

Когда я говорю что-то вроде:

Thread t1 = new Thread();

это создает это в куче или стеке?

Он может поместить его в стек при условии, что вы не используете его для создания реального потока. т.е. если ты так

Thread t1 = new Thread(runnable);
t1.start();

Он должен поместить его в кучу.

Автор: Peter Lawrey Размещён: 21.06.2016 07:29
32x32