2012-06-16 5 views
0

У меня есть программа 3D-3D, в которой используются сотни (трехмерных) 3D-моделей (3ds и obj). Чем больше моделей я использую (и действительно, действительно, это своего рода трехмерная модель объекта реального мира), тем тяжелее становится программа до тех пор, пока не будет завершена какая-либо одна операция.Как уменьшить потребление памяти программы Java

Потребление процессора редко достигает 50%, в основном, между 10% -30%, но потребление памяти растет (очевидно) с каждой добавленной 3D-моделью.

Я знаю, как свести к минимуму отпечаток памяти программ C++/c, но с GC в GC я могу что-то сделать, кроме увеличения памяти JVM с -Xmx? Я уже работаю с -xMx512Mb.

Я проверил журналы GC, используя GCViewer, не нашел ничего подозрительного.

Я знаю некоторые очень похожие вопросы о SO, но никто не ответил на мой вопрос точно.

Мой IDE является IntelliJ 11.

+0

Простым способом является прекращение использования Java. Труднее всего попытаться установить все неиспользуемые ссылки на «null», чтобы помочь GC. –

+0

Я должен быть мультиплатформенным :-( – Flot2011

+0

Для чего-то, чего вы ожидаете от голода в памяти, 512mb не так сильно звучит. –

ответ

4

Есть два простых способа уменьшить количество объектов, которые вы создаете, и один или оба из них могут работать для ваших целей, хотя и без спецификации я не могу быть уверен, ,

1) Работа с очень изменчивыми объектами. Если вам нужно симулировать большое количество вещей с большим сходством, но которые не должны взаимодействовать друг с другом (например, сто тысяч симуляций из дюжины частиц, взаимодействующих с несколько разными частицами каждый раз), затем снова и снова использовать те же десятки или около того объектов и использовать функции мутаторов для переноса нагрузки на CPU. Однако я сомневаюсь, что использование нескольких объектов в последовательности является проблемой для вас, учитывая, что Java уже имеет встроенную сборку мусора.

2) Сделайте сходство между подобными объектами своим классом. Например, если у вас есть потребность в большом количестве объектов, и вы заметите, что значительная часть из них имеет ряд характерных для памяти характеристик, сохраняйте эти характеристики в своем классе и ссылайтесь на один экземпляр этого класса в каждом объект с одинаковыми значениями поля. В качестве примера рассмотрим набор объектов Apple. Вы можете либо создать разные классы для GrannySmithApples, MackintoshApples, RedDeliciousApples со своими собственными статическими полями для характеристик, общих для класса (например, RedDeliciousApples имеет статическое поле String, объявленное в абстрактном классе Apple и настроенное на «красный»), или (чтобы разрешить больше гибкость во время выполнения), каждый класс может иметь экземпляр CoreCharacteristic. Если несколько объектов одних и те же основные характеристики, код:

CoreCharacteristic c = new CoreCharacteristic(<some parameters>); 
Apple apple1 = new Apple(c); 
Apple apple2 = new Apple(c); 
Apple apple3 = new Apple(c); 
Apple apple4 = new Apple(c); 

будет использовать только один CoreCharacteristic для всех четырех яблок, четвертование объема памяти, необходимого для хранения полой CoreCharacteristic, которые бы в противном случае были повторены для каждой компании Apple ,

1

Есть два различных подхода я могу думать о том, чтобы обрабатывать ваши вопросы:

  1. управления, когда GC пинки в: here является полная статья, описывающая, как контролировать сборщик мусора и различные алгоритмы, используемые для очистки вверх память. Я нашел этот подход очень полезным, когда приложение создает тысячи и тысячи DTO за минуту.
  2. Если ваше приложение не создает слишком много объектов, которые были повреждены быстро, я предлагаю вам взглянуть на вашу модель и повысить ее эффективность. Помните, что при работе с 3D-визуализацией важно то, как вы структурируете граф сцены.

С другой стороны, при использовании решений на основе OpenGL трехмерная визуализация не требует такого большого количества CPU. В основном это связано с тем, что GPU часто участвует в рендеринге графика сцены, а не в процессоре.

1

С моей точки зрения, у вас есть два варианта:

  1. снижения создания новых объектов, делая их неизменны, и повторные их, если они не меняются
  2. Используйте flywieght шаблона - повторное использование созданных объектов и работать с сеттеры на них, вместо создания новых снова и снова - вот отличный пример реализации, который может удовлетворить ваши потребности. http://www.javacamp.org/designPattern/flyweight.html - речь идет о создании цветовых кругов. Без flywieght это заняло 2,5x больше, а потребление памяти было ~ 200 больше. Попробуй.
Смежные вопросы