Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > boolean в памяти


Автор: Antropoid 4.11.2007, 22:13
САБЖ.
В разных источниках написано по разному. Кому верить?
СУВ.

Автор: LSD 4.11.2007, 22:20
Implementation dependent smile 

А вообще есть такой код:
Код

  public static void main(String[] args)
  {
    boolean[] data;
    Runtime runtime = Runtime.getRuntime();
    gc();
    long memBefore = runtime.totalMemory() - runtime.freeMemory();
    data = new boolean[32 * 1024 * 1024];
    gc();
    long memAfter = runtime.totalMemory() - runtime.freeMemory();
    System.out.println("size = " + (memAfter - memBefore) / ((double) data.length));
  }

  private static void gc()
  {
    System.gc();
    System.gc();
    System.gc();
    System.gc();
  }

Автор: Antropoid 4.11.2007, 22:42
Цитата(LSD @  4.11.2007,  22:20 Найти цитируемый пост)
Implementation dependent

 smile 
а как же Portable ?

и не понял код...у меня высветилось size = 1.0000004768371582 . О чем это говорит? 

Автор: LSD 4.11.2007, 23:03
Цитата(Antropoid @  4.11.2007,  23:42 Найти цитируемый пост)
а как же Portable ?

А при чем тут портабельность?
Во вне boolean всегда пишется единообразно (например DataOutputStream пишет его как int). А уж как он представляется внутри самой JVM, это дело самой JVM. Тот же int можно представлять как угодно, главное чтобы он мог хранить весь диапазон указанный в спецификации, а так пускать хоть 8 байт занимает, если так быстрей и удобней.

Цитата(Antropoid @  4.11.2007,  23:42 Найти цитируемый пост)
и не понял код...у меня высветилось size = 1.0000004768371582 . О чем это говорит? 

Это говорит о том, что занимается один байт (дробная часть от накладных расходов и всяких фоновых процессов).

Автор: Antropoid 4.11.2007, 23:19
Цитата(LSD @  4.11.2007,  23:03 Найти цитируемый пост)
А при чем тут портабельность?

Цитата

the sizes of primitive data types and the
behavior of the arithmetic on them are specified.
(с) SCJP Exam for J2SE 5, Paul Sanghera


Цитата(LSD @  4.11.2007,  23:03 Найти цитируемый пост)
Тот же int можно представлять как угодно, главное чтобы он мог хранить весь диапазон указанный в спецификации, а так пускать хоть 8 байт занимает, если так быстрей и удобней.

А мы точно об одном и том же говорим? Т.е. int - это не 4 байта? а double - не 8 ?



Автор: LSD 4.11.2007, 23:43
В данном случае size, можно трактовать по разному, как объем памяти требуемых под одну переменную, и как диапазон значений которые в ней будут храниться. Для совместимости JVM важно, чтобы совпадали диапазоны и поведение арифметических операций, а количество байт в данном случае не важно.

Автор: jer1 5.11.2007, 02:47
from http://www.javaspecialists.eu/archive/Issue029.html, http://www.javaspecialists.eu/archive/Issue142.html
Цитата

The amount of memory can be determined by looking at the data members of the class and all the superclasses' data members. The algorithm I use works as follows:

   1. The class takes up at least 8 bytes. So, if you say new Object(); you will allocate 8 bytes on the heap.
   2. Each data member takes up 4 bytes, except for long and double which take up 8 bytes. Even if the data member is a byte, it will still take up 4 bytes! In addition, the amount of memory used is increased in 8 byte blocks. So, if you have a class that contains one byte it will take up 8 bytes for the class and 8 bytes for the data, totalling 16 bytes (groan!).
   3. Arrays are a bit more clever, at least smaller primitives get packed. I'll deal with these later.

 
Код

class A {
   boolean b1, b2, b3;
}

будет занимать 24 байта =   8 (от Object ) +  3 * 4 (члены класса)  = 20 байт + 4 байт (чтобы было кратно 8)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)