|
|
|
PriorityQueue<Integer>: на хранение 1 млн элементов (все - единицы) нужно > 10 Мб. Why ?
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. Имеется очередь с приоритетом, в которую натолкан 1 млн, причем все элементы равны числу 1: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. Несколько раз позапускав этот класс, пришел вот к этому: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 1'000'000 int-чисел должен вроде бы укладываться в 4'000'000 байта. Ну ладно, еще какие-то там накладные расходы могут быть, 10-20%(?) Аппетит более 10 мегов обусловлен тем, что вместо самих чисел в коллекцию пишутся объекты класса-обёртки Integer или чем-то еще ? И как понять, сколько на самом деле занимает в памяти некий созданный объект, если у меня их много ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2013, 16:03:29 |
|
||
|
PriorityQueue<Integer>: на хранение 1 млн элементов (все - единицы) нужно > 10 Мб. Why ?
|
|||
|---|---|---|---|
|
#18+
И еще. Если заменить Код: java 1. на Код: java 1. - то аппетит еще больше вырастет: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Раз на хранение единиц памяти требовалось меньше, чем на 32767, то понятно, что JVM упаковывает числа, поступающие в коллекцию. Соотношение остается почти тем же: 22347776 / 8000000 = 2.79 vs 11776000 / 4000000 = 2.94 (см предыдущий пост). То есть, на хранение каждого байта реальной информации яве надо почти 3 байта памяти ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2013, 16:23:41 |
|
||
|
PriorityQueue<Integer>: на хранение 1 млн элементов (все - единицы) нужно > 10 Мб. Why ?
|
|||
|---|---|---|---|
|
#18+
Кажись, понял. Если число элементов заранее известно, надо задать его в конструкторе, чтобы ява не делала "упреждающие расширения" коллекции. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2013, 17:56:25 |
|
||
|
PriorityQueue<Integer>: на хранение 1 млн элементов (все - единицы) нужно > 10 Мб. Why ?
|
|||
|---|---|---|---|
|
#18+
ozzmosisЗдравствуйте. 1'000'000 int-чисел должен вроде бы укладываться в 4'000'000 байта. Ну ладно, еще какие-то там накладные расходы могут быть, 10-20%(?) Аппетит более 10 мегов обусловлен тем, что вместо самих чисел в коллекцию пишутся объекты класса-обёртки Integer или чем-то еще ? И как понять, сколько на самом деле занимает в памяти некий созданный объект, если у меня их много ? Ты прикалываешься? Зачем ты смотришь на Runtime.getRuntime().totalMemory() ? Смотри хотя бы на используемую память: Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory() Далее, pq держит ссылки на объекты. Ссылка - 4 или 8 байтов, в зависимости от JRE (и настроек JVM). Соот-но 4 или 8 MB. Плюс сами объекты. 1 - это Integer, который кэшируется (кэшируется от -128 до 127, но это можно менять). А 32767 - это Integer, который каждый раз создается заново. Т.е. еще плюс 4MB. Точные размеры объектов скажут всякие профилеры. Можно попробовать java.lang.instrument.Instrumentation#getObjectSize(), но я бы не стал зацикливаться на точном знании размера сложных объектов. Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory() достаточно :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2013, 18:13:40 |
|
||
|
PriorityQueue<Integer>: на хранение 1 млн элементов (все - единицы) нужно > 10 Мб. Why ?
|
|||
|---|---|---|---|
|
#18+
J.SergeТы прикалываешься? Зачем ты смотришь на Runtime.getRuntime().totalMemory() ? Смотри хотя бы на используемую память: Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory() Далее, pq держит ссылки на объекты. Ссылка - 4 или 8 байтов, в зависимости от JRE (и настроек JVM). Соот-но 4 или 8 MB. Плюс сами объекты. 1 - это Integer, который кэшируется (кэшируется от -128 до 127, но это можно менять). А 32767 - это Integer, который каждый раз создается заново. Т.е. еще плюс 4MB.я не прикалывался; просто не знал этого. Спасибо за ответ, стало понятнее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2013, 23:02:04 |
|
||
|
PriorityQueue<Integer>: на хранение 1 млн элементов (все - единицы) нужно > 10 Мб. Why ?
|
|||
|---|---|---|---|
|
#18+
J.SergeПлюс сами объекты. 1 - это Integer, который кэшируется (кэшируется от -128 до 127, но это можно менять ).Как это сделать ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2013, 23:18:21 |
|
||
|
PriorityQueue<Integer>: на хранение 1 млн элементов (все - единицы) нужно > 10 Мб. Why ?
|
|||
|---|---|---|---|
|
#18+
ozzmosisJ.SergeПлюс сами объекты. 1 - это Integer, который кэшируется (кэшируется от -128 до 127, но это можно менять ).Как это сделать ? -Djava.lang.Integer.IntegerCache.high=<size> или JVM: -XX:AutoBoxCacheMax=<size> ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2013, 23:25:18 |
|
||
|
|

start [/forum/topic.php?fid=59&tid=2129551]: |
0ms |
get settings: |
14ms |
get forum list: |
17ms |
check forum access: |
6ms |
check topic access: |
6ms |
track hit: |
63ms |
get topic data: |
16ms |
get forum data: |
5ms |
get page messages: |
78ms |
get tp. blocked users: |
2ms |
| others: | 277ms |
| total: | 484ms |

| 0 / 0 |
