понедельник, 28 февраля 2011 г.

Анонс Ruby Coding Conventions

JVM and Permanent generation

О чем речь

Бывает, что выделяешь JVM много оперативной памяти, она тебе все равно падает. И пишет, что переполнение.
Все становится ясно, когда смотришь в профайл и видишь, что во всем виноват Permanent Generation (PG).

Пару слов о PG.

Permanent Generation используется JVM для хранения служебных данных, в том числе метаданные о созданных объектах и т.д. При каждом создании объекта JVM будет сохранять связанный с ним набор данных в PG. Соответственно, чем больше вы создаете объектов разных типов, тем больше пространства требуется в PG.

Как задать размер PG.

Размер PG можно задать двумя параметрами JVM:
-XX:PermSize – задаёт минимальный, или изначальный, размер PG, и -XX:MaxPermSize – задаёт максимальный размер.
При запуске больших Java-приложений лучше задать значения для этих параметров одинаковыми, так что PG создаётся сразу с максимальным размером, что может увеличить производительность, так как изменение размера PG – дорогостоящая (трудоёмкая) операция. Определение одинаковых значений для этих двух параметров может избавить JVM от выполнения дополнительных операций, таких как проверки необходимости изменения размера PG и, естественно, непосредственного изменения.

Доп. ссылки

про сборку муссора в Hotspot JVM
FAQ o PG в Hotspot JVM
Модель памяти в виртуальной Java-машине: Permanent Generation


четверг, 24 февраля 2011 г.

понедельник, 14 февраля 2011 г.

Если у вас undefined method `total_pages'.

Опишем ситуацию в общем виде:
Хотим сделать запрос к базе, получить данные и отсортировать их по определенному атрибуту.
Все идет хорошо и вдруг возникает ОШИБКА вида:
ActionView::TemplateError (undefined method `total_pages' for #<Array:0x5e82358>)

Это связано с испоьзованием:
escape_javascript will_paginate @transactions
и
@transactions = @transactions.sort_by { |transaction| transaction.name }

Проблема кроется в том, что Array не имеет метода total_pages.


Для того, что бы все было хорошо делаем так:
@transactions.sort! { |a,b| a.name <=> b.name }

И все работает. Спасибо ресурсу, а также.