Есть ли какая-то разница в распределении памяти с помощью нового оператора в классе Java-оболочки? - PullRequest
3 голосов
/ 15 марта 2011

Есть ли какая-либо разница в распределении памяти при использовании нового opeartor в классе оболочки Java?

Для класса

public class TestClass {
    Integer r=9;
}

размер выделенной памяти составляет 5152 байта в 32-битной JVM

где как для

public class TestClass1 {

    Integer i=new Integer(1);

}

размер памяти составляет 32 байта.

почему для класса TestClass1 выделяется меньше памяти?

Ответы [ 5 ]

2 голосов
/ 15 марта 2011

Линия:

Integer r = 9;

фактически становится:

Integer r = Integer.valueOf(9);

из-за автобокса, который извлекает кэшированный объект Integer. Если вы проверяете JLS Раздел 5.1.7 о преобразованиях в боксы, это говорит о том, что целочисленные значения между -128 и 127 кэшируются. На практике первый вызов Integer.valueOf() (который включает в себя случаи автобокса) инициализирует кэш, который может составлять другой объем памяти.

1 голос
/ 15 марта 2011

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

Integer r = 9;
1 голос
/ 15 марта 2011

Как вы это измеряете?

Мне кажется, что JVM вполне могла бы оптимизировать Integer в TestClass1, так как он никогда не использовался, оставляя ссылку на пустой класс

0 голосов
/ 15 марта 2011

В: Почему для класса TestClass1 выделяется меньше памяти?

Как уже упоминалось в krock,

Integer i = 9; 

станет

Integer i = Integer.valueOf(9);  

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

Кэш содержит значения от -128 до обычно 127, что дает 255 значений, которые должны быть инициализированы (new Integer(i)).И это вызывает такое большое использование памяти.

Возобновляемая инструкция

  • i = new Interger(9); - создаст один объект Integer,
  • i = 9; - создаст не менее 255 объектов Integer и один массив,

Примечание: инициализация кэша не зависит от значения в штучной упаковке.Кэш также инициализируется, когда вы помещаете в бокс значения ниже -128 и больше, чем обычно 127.

0 голосов
/ 15 марта 2011
public class Sizer {

  public static void main(String [] args) throws Exception {
    Runtime r = Runtime.getRuntime();

    // Pre-instantiate variables
    long memoryBefore = 0;
    long memoryAfter = 0;
    int loops = 10;

    runGC(r, loops);
    memoryBefore = getMemoryUsage(r);

//     Long lo = new Long(1);
    TestClass in = new TestClass(); 

    runGC(r, loops);
    memoryAfter = getMemoryUsage(r);

    System.out.println("Diff in size is " + (memoryAfter - memoryBefore));
  }

  public static void runGC(Runtime r, int loops) throws Exception {
    for(int i=0; i<loops; i++) {
      r.gc();
      Thread.sleep(2000);
    }
  }

  public static long getMemoryUsage(Runtime r) throws Exception {
    long usedMemory = r.totalMemory() - r.freeMemory();
    System.out.println("Memory Usage: " + usedMemory);
    return usedMemory;
  }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...