Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Выделение памяти под массив, или сколько байт занимает ссылка 
:(
    Опции темы
UnicornMirage
Дата 28.2.2006, 00:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 138
Регистрация: 15.11.2005

Репутация: 1
Всего: 1



любой массив объектов в Java хранит ссылки на объекты (какими они ни были эти объекты). отсюда следует что все проинициализированные массивы будут занимать одинаковый объем памяти? (разумеется учитывается только массив ссылок на объекты а не сами проинициализированные объекты):

Код

MyObject[] arr_1 = {new MyObject(1), new MyObject(2), ..., new MyObject(n)}
File[] arr_2 = new File[n];
String[] arr_3 = new String[n];

для всех равных n


сколько байт занимает одна ссылка?
PM MAIL   Вверх
redrick
Дата 28.2.2006, 01:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 547
Регистрация: 7.1.2004
Где: Москва

Репутация: 3
Всего: 5



Вобщем, в спецификации VM это не оговаривается.
Одна ссылка может занимать сколько угодно, в зависимости от реализации. На практике, правда, это обычно 4 байта.
А насчет одинаковости - опять же, скорее всего, но не обязательно, обязательно только то что по данной ссылке ты сможешь вытащить объект которым ее проинициализировал.


--------------------
Имею Мнение Хрен Оспоришь   
PM MAIL ICQ   Вверх
LSD
Дата 28.2.2006, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



На 64-х битных машинах, скорее всего одна ссылка будет занимать 8 байт. А вообще это не сложно узнать:
Код
  public static void main(String[] args)
  {
    int size = 1024 * 1014;
    Runtime runtime = Runtime.getRuntime();
    doGC();
    long before = runtime.totalMemory() - runtime.freeMemory();
    Object[] obj = new Object[size];
    long after = runtime.totalMemory() - runtime.freeMemory();
    System.out.println("sizeof(Object[" + size + "]) = " + (after - before) + " bytes, " + ((after - before) / (double) size) + " bytes/element");
  }

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



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
powerOn
Дата 28.2.2006, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 47
Всего: 159



Цитата

Код

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



Простите, а зачем 4 раза сборщик мусора поднимать?


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
redrick
Дата 28.2.2006, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 547
Регистрация: 7.1.2004
Где: Москва

Репутация: 3
Всего: 5



Цитата(MoonCat @ 28.2.2006, 11:58 Найти цитируемый пост)
ростите, а зачем 4 раза сборщик мусора поднимать?

для пущей лучшести =)


--------------------
Имею Мнение Хрен Оспоришь   
PM MAIL ICQ   Вверх
LSD
Дата 28.2.2006, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



А щоб наверняка smile
1. Вызов System.gc() не гарантирует, что сборщик будет реально вызван
Цитата
Calling the gc method suggests that the Java Virtual Machine expend effort toward recycling unused objects in order to make the memory they currently occupy available for quick reuse.

2. Сборщик мусора инкрементальный, и может не все объекты очистить после первого вызова.

Это уже обсуждалось, если найду кину ссылку.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
UnicornMirage
Дата 28.2.2006, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 138
Регистрация: 15.11.2005

Репутация: 1
Всего: 1



спасибо за ответы.
теперь отвечу почему я задал такой вопрос - например есть задача - где необходимо выделить своеобразный КЭШ для объектов произвольного типа. размер КЕШа заранее известен, также известен его максимально-возможный размер.. и в этом случае целесообразнее использовать заранее выделенный массив ссылок на объекты, чем использовать коллекции или списки, т.к. это будет работать гораздо быстрее?


PM MAIL   Вверх
redrick
Дата 28.2.2006, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 547
Регистрация: 7.1.2004
Где: Москва

Репутация: 3
Всего: 5



если у тебя в кеше лежат большие объекты (уж побольше чем 4 или 8 байт) то, думаю, колекция маленьких ссылок не испортит тебе жизнь

Вобщем незачем этот массив заранее выделять - ничего это не дает.


--------------------
Имею Мнение Хрен Оспоришь   
PM MAIL ICQ   Вверх
COVD
Дата 28.2.2006, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 17
Всего: 43



Цитата

это будет работать гораздо быстрее?


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

Любая стандартная коллекция или лист требуют применения кастинга при извлечении обьектов. На это тоже не принято обращать внимания. Если же производительность - узкое место (редко, но бывает), то можно хранить в массиве конкретного типа. Не нужен кастинг и доступ по индексу - самый быстрый.
PM MAIL   Вверх
king
Дата 9.4.2006, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 9.4.2006

Репутация: нет
Всего: нет



То что указатель занимает 4 байта понятно.. Но меня еще интересует другой вопрос : сколько занимает сам объект .. Немного модернизировал ваш код :

Код

public class MemoryTest
{
    
    public static void main(String[] args)
      {
        int size = 1024 * 1014;
        Runtime runtime = Runtime.getRuntime();
        doGC();
        long before = runtime.totalMemory() - runtime.freeMemory();
        Test[] obj = new Test[size];
        for (int i = 0; i < size; i++ )
        {
         obj[i] = new Test();

        }
        
        long after = runtime.totalMemory() - runtime.freeMemory();
        System.out.println("sizeof(Test[" + size + "]) = " + (after - before) + " bytes, " + ((after - before) / (double) size) + " bytes/element");
      }

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

}



и получил :

sizeof(Test[1038336]) = 20771840 bytes, 20.004930966469427 bytes/element

т.е 20 байтов на элемент. Из них 4 идет на указатель.. а 16 на объект..
После эксперементов установил следующую закономерность :
0 полей - 8 байт
1 интовое поле - 16 байт
2 интовых поля - 16 байт
3 интовых поля - 24 байт
4 интовых поля - 24 байт
5 интовых поля - 32 байт

т.е пустой клас занимает 8 байт, дальше идет выравнивание размера на 8 байт .. Это нормальное поведение для ява програмы? просто получается что большое количество объектов создавать не выгодно в яве.. в с++ можно делать структуры (это фактичнски те же самые классы) , но весят они именно столько , сколько от них ждешь

Это сообщение отредактировал(а) king - 9.4.2006, 17:57
PM MAIL   Вверх
powerOn
Дата 9.4.2006, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 47
Всего: 159



А класс Test как выглядит?


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
LSD
Дата 9.4.2006, 20:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(king @ 9.4.2006, 18:41 Найти цитируемый пост)
Это нормальное поведение для ява програмы?

Это зависит от реализации JVM, но вообщем поведение нормальное.


Цитата(king @ 9.4.2006, 18:41 Найти цитируемый пост)
получается что большое количество объектов создавать не выгодно в яве.. в с++ можно делать структуры (это фактичнски те же самые классы) , но весят они именно столько , сколько от них ждешь

Если ты будешь создавать структуры с парой чисел типа int (например координаты), и создавать их миллионами. То с помощью структур это делать выгодней. Но если у тебя храняться сколько нибудь объемные данные, то 8 байт тебе погоды не сделают.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
king
Дата 10.4.2006, 08:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 9.4.2006

Репутация: нет
Всего: нет



Цитата(MoonCat @ 9.4.2006, 19:21)
А класс Test как выглядит?

Код

class Test
{
    int p = 10;
}

PM MAIL   Вверх
powerOn
Дата 10.4.2006, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 47
Всего: 159



Цитата

в с++ можно делать структуры (это фактичнски те же самые классы) , но весят они именно столько , сколько от них ждешь


В С++ структуры весять как сумма "масс" полей, но это структуры. В Java нет структур. В Java есть классы.
А это означает, что любой класс, даже такой:
Цитата

class Test
{
    int p = 10;
}


будет наследован от класса Object, который в свою очередь тоже требует определенного объема памяти.

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

Код

Vector v = new Vector();
v.addElement(new Float(10.5);
v.addElement(new Integer(20));
v.addElement(new Vector());


, поскольку есть метод addElement(Object o). И не важно кто есть o. Это дает дополнительную гибкость.

И вообще, если даже на MFC посмотреть, там тоже большинство классов унаследованны от CObject, который, вероятно, тоже занимает определенное место в памяти. smile



--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0564 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.