Переменная и ее объем

131
26 сентября 2019, 16:10

Занимает ли переменная место в куче при объявлении? Иными словами, если я захочу объявить переменную, повлияет ли это на объем используемой памяти?

Answer 1

Да повлияет, но незначительно, однако если переменных много увеличение объёма используемой памяти будет большим (для современных ПК все равно некритичным).

Память под переменную выделяется, если только Вы используете ее в коде. (заслуга компилятора)

В зависимости от типа переменные могут занимать различный объем памяти. Самый малый byte — Занимает один байт памяти, а самый "Объемный" тип double — 8 байт. String — смотря сколько символов в строке. Тут можно посмотреть весь список примитивов. Чем больше примитивов в классе, тем больше будет весить объект класса.

Конкретно в кучу "складываются" только объекты, переменные помещаются в стек.

Answer 2

Место в куче занимают объекты. Переменные занимают место в стеке. Но если вы объявите переменную и никогда её не используете, компилятор её вообще выкинет. Например этот код

public class Example {
    public static void main(String[] args) {
        int a;
        int b = 2;
    }
}

Будет скомпилирован в такой class-файл (для краткости показываю только метод main):

  public static void main(java.lang.String[]);
    descriptor: ([Ljava/lang/String;)V
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=1, locals=3, args_size=1
         0: iconst_2
         1: istore_2
         2: return
      LineNumberTable:
        line 53: 0
        line 54: 2
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0       3     0  args   [Ljava/lang/String;
            2       1     2     b   I

Как видно, нет даже упоминания переменной a.

READ ALSO
Компоненты GUI и объект события

Компоненты GUI и объект события

Как заставить компонент GUI(кнопку, например) передать в метод класса-слушателя параметр?

131
Проверка возвратил ли что-то SQLite select

Проверка возвратил ли что-то SQLite select

как я могу проверить, вернул ли что-то данный запрос? ResultSet rs = stmtexecuteQuery( "SELECT * FROM USERS WHERE NICK ='" + nick + "';" ); (Я хочу проверить имеется ли запись...

130
Вызываю из статического блока метод, не инициализирует

Вызываю из статического блока метод, не инициализирует

Из статического блока вызываю метод который инициализирует массив (причем в самом методе это видно - выводит 35)Но когда обращаюсь в коде - оказывается...

129