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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Маленький тест, :) 
:(
    Опции темы
ElectricalStorm
Дата 8.7.2004, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Domestic Cat - большое спасибо за информацию !!!
очень интересно



--------------------
Нужно знать инструмент, которым пользуешься
PM MAIL   Вверх
Domestic Cat
Дата 8.7.2004, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

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



2. Первоначально хип имеет достаточно маленький размер. По мере его заполнения, JVM
пытается высвободить место, убирая мусор. Если это не удается, JVM увеличивает размер хипа.
Если программа создаэт много обэктов в короткий промежуток времени, то JVM много
времени будет уделять перезапускам gc, увеличениям хипа, и т д.
Чтобы минимизировать сборку мусора, нужно изначально создавать достаточно большой хип.
Чтобы узнать необходимый размер, проведем мониторинг памяти:
Код

public class MemMonitor
{
   public static class Data
   {
       float lastValue = 0;
       float min = Float.MAX_VALUE;
       float max = Float.MIN_VALUE;
       float sum = 0;
       int count = 0;

       public void addValue(float value)
      {
           lastValue = value;
           sum+=value;
           count++;
           min = Math.min(min, value);
           max = Math.max(max, value);
       }
       public String toString()
      {
           return "Min: " + toByteFormat(min) + "  " +
                  "Max: " + toByteFormat(max) + "  " +
                  "Avg: " + toByteFormat(sum / count);
       }
   }
   private Data heapSize = new Data();
   private Data allocSize = new Data();
   private Data allocIncPerUpdate = new Data();
   private int numHeapIncs = 0;
   private long startTime = System.currentTimeMillis();

   public void takeSample()
   {
       Runtime runtime = Runtime.getRuntime();
       long currHeapSize = runtime.totalMemory();
       long currAllocSize = currHeapSize - runtime.freeMemory();

       if (currHeapSize > heapSize.lastValue)
      {
           numHeapIncs++;
       }
       if (currAllocSize >= allocSize.lastValue)
       {
           allocIncPerUpdate.addValue(
               (currAllocSize - allocSize.lastValue));
       }
       heapSize.addValue(currHeapSize);
       allocSize.addValue(currAllocSize);
   }

   public static String toByteFormat(float numBytes)
   {
       String[] labels = {" bytes", " KB", " MB", " GB"};
       int labelIndex = 0;
       while (labelIndex < labels.length - 1 && numBytes > 1024)
       {
           numBytes/=1024;
           labelIndex++;
       }
       return (Math.round(numBytes*10)/10f) + labels[labelIndex];
   }

   public String toString()
   {
       long time = System.currentTimeMillis() - startTime;
       float timeSecs = (float)time / 1000;
       return "Total Time: " + timeSecs + "s\n" +
           "Heap: " + heapSize + "\n" +
           "Allocation: " + allocSize + "\n" +
           "Allocation inc/update: " + allocIncPerUpdate + "\n" +
           "Num Heap Incs: " + numHeapIncs;
   }
}

Программа определяет минимальный/максималный размер хипа, выделенной памяти и приращения. Для сбора данных я из цикла вызиваю метод takeSample(); при выходе/заверщении просто передаю обэкт класса MemMonitor в System.out.
При запуске того же шутера я получил:
Цитата

Total Time: 34.754s
Heap: Min: 4.0 MB  Max: 36.9 MB  Avg: 25.1 MB
Allocation: Min: 3.5 MB  Max: 28.9 MB  Avg: 17.9 MB
Allocation inc/update: Min: 1.0 KB  Max: 5.0 MB  Avg: 162.8 KB
Num Heap Incs: 6

(Желательно конечно поработать дольше)
За время выполнения было сделано 29 уборок мусора на молодом хипе, и 11 - на старом, что заняло около 4 секунд!

Видно, что JVM начинает с хипа в 4 мб; он увеличивается до 40 мб. Чтобы посчитать приблизительный размер молодого хипа, учтем ,что приращение за 1 фрейм составляет 162.8 кб; при прорисовке 10 фрэймов/сек за 10 сек мы получим ~ 10 мб идет в молодой хип.

Скажем JVM теперь что изначально нужно 40 мб хипа и 10 мб молодого хипа:

java -Xms40m -Xmn10m -verbose:gc Test

Вот что я получил:
Цитата

[GC [DefNew: 8191K->1024K(9216K), 0.0919743 secs] 8191K->2329K(39936K), 0.0921144 secs]
[GC [DefNew: 9215K->1024K(9216K), 0.0545125 secs] 10521K->9647K(39936K), 0.0546372 secs]
[GC [DefNew: 9216K->1022K(9216K), 0.0940688 secs] 18634K->18593K(39936K), 0.0942104 secs]
[GC [DefNew: 9195K->1023K(9216K), 0.0846478 secs] 29923K->29777K(39936K), 0.0847471 secs]
Total Time: 29.68s
Heap: Min: 39.0 MB  Max: 39.0 MB  Avg: 39.0 MB
Allocation: Min: 2.9 MB  Max: 33.6 MB  Avg: 22.4 MB
Allocation inc/update: Min: 1.0 KB  Max: 7.4 MB  Avg: 207.3 KB
Num Heap Incs: 1


Всего 4 уборки мусора на молодом хипе - и игра идет гораздо плавнее smile.gif

Это сообщение отредактировал(а) Domestic Cat - 8.7.2004, 17:05


--------------------

PM   Вверх
ElectricalStorm
Дата 8.7.2004, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



у меня вот эта команда
java -Xms40m -Xmn4m -verbose:gc Test

ничего не выдает пустую строку sad.gif



--------------------
Нужно знать инструмент, которым пользуешься
PM MAIL   Вверх
Domestic Cat
Дата 8.7.2004, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

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



Цитата
у меня вот эта команда
java -Xms40m -Xmn4m -verbose:gc Test
ничего не выдает пустую строку


Имеется в виду, что Test- название вашего java-класса; кроме того программа должна создавать
МНОГО обьектов, иначе просто сборшик мусора не запускается - собирать нечего.
Чтобы подключить MemMonitor, нужно из цuкла (например, цuкла анимации) вызывать takeSample().

Добавлено @ 16:53
Попробууте такую программу:
Код

import java.awt.Color;

public class Test
{
   static MemMonitor monitor = new MemMonitor();
   public static void main(String[] args)
   {
       for (int i = 0; i < 1000000; i++)
       {
           monitor.takeSample();
           new Color(100, 100, 100);
       }
       System.out.println(monitor);
   }
}


java -verbose:gc Test

u поекспериментируuте с размерами хипов.



--------------------

PM   Вверх
ElectricalStorm
Дата 8.7.2004, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Спасибо ! все получилось


--------------------
Нужно знать инструмент, которым пользуешься
PM MAIL   Вверх
ElectricalStorm
Дата 8.7.2004, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А вы не могли рассказать про способы оптимизации Java програм ?
adv/76.gif


--------------------
Нужно знать инструмент, которым пользуешься
PM MAIL   Вверх
Domestic Cat
Дата 8.7.2004, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

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



smile.gif

Не претендую на абсолютную истину, но попробую.

Не оптимизируйте! Пишите программы, которые понятны, легко дебагить и модифицировать.

На самом деле конечно оптимизировать нужно. Чтобы понять что оптимизировать, помните,
что в основном нагрузка приходится на 10-20% кода. Узнать какой метод наиболее задействован
мозжно, запустив с флагом -Xprof.

На самом деле HotSpot и JIT (Just-In-Time Compiler) делают большую работу по оптимизации. Можно легко найти инфо по этому вопросу. В целом же оптимизация программы программистом сводится к:

1. Использованию оптимальных алгоритмов. Например, для быстрого поиска используйте
HashMap, он быстрее чем, скажем TreeMap.

2. Старайтесь использоват побитовые операции. Вместо х/32 луче использоват х >> 5; вместо
х % 32 - х & 31 (31 = 32 - 1). Работает только для степеней 2.

3. Заменяйте умножение на суммирование, возведение в степень - на умножение.

4. Используйте готовые таблицы значений. Например, если нужно считать синус/косинус и
большая точность вычислений не нужна, используйте готовую таблицу для синуса.

5.Заменяйте операции с float, double на операции с int и делайте кастинг назад в float (тут на предыдущей странице пример есть )

6. Используйте Buffered{}Stream

7. Если нужен рандом -доступ к большим файлам (несколько мб), используйте memory-mapped files (см MappedByteBuffer в Java API). Программа может читать из MappedByteBuffer почти так же быстро, как из памяти.

Это сообщение отредактировал(а) Domestic Cat - 8.7.2004, 18:08


--------------------

PM   Вверх
ElectricalStorm
Дата 8.7.2004, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Большое спасибо .... мотаем на ус ...

Вот при компиляции javac версии 1.4 без флагов используется технология HotSpot и JIT
или это специальные программы выполняют стандартный компилятор это не делает ?


--------------------
Нужно знать инструмент, которым пользуешься
PM MAIL   Вверх
Domestic Cat
Дата 8.7.2004, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

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



При компиляции javac делает небольшие оптимизации (можно ради интереса декомпильнуть class-фаuл и посмотреть).
"Еше" больше oптимизировать можно, компилируя с флагом -O, но я особоu разницы не замечаю.
JIT же, как следует из названия, дополнительно компилирует при запуске JVM (java MyClassName), на 1.4 тоже; причем его оптимизации очень сушественные. Опять-таки, дополнительную оптимизацию дает запуск с флагом -server (java -server MyClassName), например, тогда JIT может "развернуть" цuклы.

Это сообщение отредактировал(а) Domestic Cat - 8.7.2004, 18:15


--------------------

PM   Вверх
ElectricalStorm
Дата 8.7.2004, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



понятно спасибо !


--------------------
Нужно знать инструмент, которым пользуешься
PM MAIL   Вверх
Domestic Cat
Дата 8.7.2004, 19:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

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



Не за что smile.gif

Ну и вопрос в тему: как сменить иконку java-программы с "Hot Java" на какую-нибудь другую?


--------------------

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


Leprechaun Software Developer
****


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

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



setIconImage()
У меня нет -Xmn в списке команд sad.gif .
А есть возможность узнать распределение по старому и молодому хипу програмно?


--------------------
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   Вверх
Domestic Cat
Дата 8.7.2004, 21:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

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



Цитата
setIconImage()


работает не всегда. Меняет ли он иконку на панели задач?

Цитата
У меня нет -Xmn в списке команд.

- в списке (java -X) ее нет, но работает smile.gif

Цитата
А есть возможность узнать распределение по старому и молодому хипу програмно?

Po-moemu, нет. Можно узнать только размер всего хипа.



--------------------

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


Leprechaun Software Developer
****


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

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



Цитата(Domestic @ 8.7.2004, 21:09)
Меняет ли он иконку на панели задач?

Под виндами меняет и на панели задач и у диалоговых окон для которых это установленно как родительское.


--------------------
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   Вверх
Domestic Cat
Дата 8.7.2004, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

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



Тогда соррu. На Маке не меняет, зато

-Xdock:icon=logo.gif

работает

Это сообщение отредактировал(а) Domestic Cat - 8.7.2004, 21:16


--------------------

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

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

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


 




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


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

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