Arhn - архитектура программирования

Примитивы Java идут в стек или в кучу?

Я просто знаю, что непримитивы (объекты) помещаются в кучу, а методы - в стек, но как насчет примитивных переменных?

--update

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


  • У каждого потока есть свой стек, а не у каждого объекта. Если есть только один поток, значит, есть только один стек. 29.10.2016

Ответы:


1

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

public class Test {
    private static class HeapClass {
        public int y; // When an instance of HeapClass is allocated, this will be on the heap.
    }
    public static void main(String[] args) {
        int x=1; // This is on the stack.
    }
}

По поводу обновления:

У объектов нет своего стека. В моем примере int y фактически будет частью каждого экземпляра HeapClass. Каждый раз, когда выделяется экземпляр HeapClass (например, new Test.HeapClass()), все переменные-члены HeapClass добавляются в кучу. Таким образом, поскольку экземпляры HeapClass размещаются в куче, int y будет находиться в куче как часть экземпляра HeapClass.

Однако все примитивные переменные, объявленные в теле любого метода, будут в стеке.

Как вы можете видеть в приведенном выше примере, int x находится в стеке, потому что он объявлен в теле метода, а не как член класса.

05.09.2010
  • Если подумать, это имеет смысл, поскольку лексическая область видимости локальной переменной будет определять, когда ее нужно удалить из стека. :-). Когда объект готов для мусора, все должно уйти. Однако у меня всегда возникают проблемы со статическими членами класса. Я не могу вспомнить, куда идут эти ценности. Скажем, если int y был статическим членом :-P 09.02.2015

  • 2

    Все локальные переменные (включая аргументы метода) попадают в стек; объекты и все их поля хранятся в куче. Переменные всегда являются примитивами или ссылками на объекты.

    Реализации Java могут фактически хранить объекты в куче таким образом, чтобы они соответствовали спецификации. Точно так же локальные переменные могут храниться в регистрах или стать нечеткими в результате оптимизации.

    05.09.2010

    3

    примитивы можно найти в обоих местах.

    class Foo
    {
       public int x;
       public static void Main()
       {
          int y = 3; // y is on the stack
          Foo f = new Foo();  // f.x is probably on the heap
       } 
    }
    

    за исключением того, что вам все равно, если вы не создаете JVM. Действительно умный оптимизатор может решить, что, поскольку Foo, на которое указывает f, никогда не ускользает от Main и никогда не передается другой функции, его можно безопасно разместить в стеке.

    По поводу обновления:

    Стек и куча различаются не тем, что в них хранится, а выполняемыми для них операциями. Стек позволяет вам выделить часть памяти способом LIFO, вы не можете освободить часть, пока все части младше, чем она, также не будут освобождены. Это удобно совпадает с тем, как используется стек вызовов. Вы можете помещать в стек что угодно, если это нормально, когда эта вещь исчезнет, ​​когда ваша функция вернется. Это оптимизация, так как он очень быстро выделяется и освобождается из стека, поскольку он поддерживает только использование таким образом. При желании можно было бы сохранить все локальные переменные для функции в куче в реализации. Куча более гибкая и, следовательно, более дорогая в использовании. Было бы неверно сказать, что у объекта есть стек и куча, как я уже сказал, что отличает стек от кучи не то, что в нем находится, а доступные операции.

    05.09.2010
  • @Logan: // f.x is probably on the heap - ›Вы хотите сказать, что это зависит от реализации JVM? 10.03.2017

  • 4

    Примитивные значения размещаются в стеке, если они не являются полями объекта, и в этом случае они помещаются в кучу. Стек используется для оценки и выполнения, поэтому нет смысла говорить, что объекты с примитивными полями имеют стек - он по-прежнему считается частью кучи. В куче размещено даже Stack объектов.

    05.09.2010
  • когда я передаю примитив от одного объекта к методу другого объекта, локальные переменные всегда помещаются в стек, верно? (даже метод статический или нет) 07.03.2021
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..