?

Log in

No account? Create an account

Entries by category: it

Наверное, все, работающие с Java, знают об управлении памяти на уровне, что для ее распределения используется сборщик мусора. Не все, к сожалению, знают, как именно этот сборщик (-и) работает, и как именно организована память внутри процесса Java.


Из-за этого иногда делается неверный вывод, что memory leaks в Java не бывает, и слишком задумываться о памяти не надо. Так же часто идут холивары по поводу чрезмерного расхода памяти.
Все описанное далее относится к Sun-овской реализации JVM (HotSpot), версий 5.0+, конкретные детали и алгоритмы могут различаться для разных версий.

Итак, память процесса различается на heap (куча) и non-heap (стек) память, и состоит из 5 областей (memory pools, memory spaces):
• Eden Space (heap) – в этой области выделятся память под все создаваемые из программы объекты. Большая часть объектов живет недолго (итераторы, временные объекты, используемые внутри методов и т.п.), и удаляются при выполнении сборок мусора это области памяти, не перемещаются в другие области памяти. Когда данная область заполняется (т.е. количество выделенной памяти в этой области превышает некоторый заданный процент), GC выполняет быструю (minor collection) сборку мусора. По сравнению с полной сборкой мусора она занимает мало времени, и затрагивает только эту область памяти — очищает от устаревших объектов Eden Space и перемещает выжившие объекты в следующую область.
• Survivor Space (heap) – сюда перемещаются объекты из предыдущей, после того, как они пережили хотя бы одну сборку мусора. Время от времени долгоживущие объекты из этой области перемещаются в Tenured Space.
• Tenured (Old) Generation (heap) — Здесь скапливаются долгоживущие объекты (крупные высокоуровневые объекты, синглтоны, менеджеры ресурсов и проч.). Когда заполняется эта область, выполняется полная сборка мусора (full, major collection), которая обрабатывает все созданные JVM объекты.
• Permanent Generation (non-heap) – Здесь хранится метаинформация, используемая JVM (используемые классы, методы и т.п.). В частноси
• Code Cache (non-heap) — эта область используется JVM, когда включена JIT-компиляция, в ней кешируется скомпилированный платформенно — зависимый код.

Вот тут — blogs.sun.com/vmrobot/entry/основы_сборки_мусора_в_hotspot есть хорошее описание работы сборщиков мусора, перепечатывать не вижу смысла, советую всем интересующимся ознакомиться подробней по ссылке.
Немного об одной тонкости в системе привилегий Oracle, о которой не все знают, и которая может съесть немало времени на отладку.

Суть в следующем --
Для хранимых процедур, триггеров и прочего PL/SQL (но НЕ для анонимных блоков PL/SQL!) привилегии, необходимые для выполения команд динамического SQL (например, execute immediate ('create synonym s1 for table_1')) должны быть даны создателю (тому пользователю, в схеме которого выполняется процедура или триггер) явно, а не через роль. Очень важный момент, речь идет не о привилегии на выполнение процедуры, а о привилегиях, необходимых для выполнения команд динамического SQL.

Подробности тут - www.sql.ru/faq/faq_topic.aspx

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

Сайт Intuit.ru и его тесты

Сдал для получения автомата по базам данных в универе тесты на Intuil.ru по MySQL и по прологу.
Тесты сами по себе -- фигня, проходятся с базовым знанием предмета и сильно развитым скилом гугления за час от силы каждый. Зато диплом - симпатичный :)
Не удержусь и дам ссылки (кликабельно):

Диплом Интернет-Университета Информационных Технологий: Введение в СУБД MySQL


Диплом Интернет-Университета Информационных Технологий: Основы программирования на языке Пролог
Недавно на работе возникла необходимость запустить сервер приложений JBoss в виде
Windows NT service.
Найдено было два способа, дам ссылки на оба, может кому пригодится.
Первый из них подходит только для JBoss, зато второй гораздо более общий -- с его помощью можно запускать в виде сервисов любое Javа-приложение, причем с кучей дополнительных возможностей, (и, конечно, под любой осью).

Оба способа описаны тут - http://wiki.jboss.org/wiki/RunJBossAsAServiceOnWindows.

Итак, для первого способа -- качаем билд JBossNative под свою ось,  как указано в инструкции, и читаем readme-service для инструкций :)

http://wiki.jboss.org/wiki/JBossNativeWindows -- или смотрим их здесь.  Этим способом JBoss ставится действительно одной командой с консоли:
C:\> cd c:\jboss-4.2.0\bin
C:\> service.bat install
А теперь чуть подробней про второй способ. Прежде всего -- он не совсем бесплатный, бесплатен он для open-source и продуктов, лицензированных иным способом, но от которых вы не получаете дохода. В двух словах так, но советую внимательней прочитать лицензию. Идем на сайт производителя Java Service Wrapper тула - http://wrapper.tanukisoftware.org/. Качаем архив (я советую скачивать архив только под родную ОС), дальше действуем как описано в самой первой ссылке этого поста. Расписано все понятно, и собственно заводится и работает все без танцев с бубном, но есть пара неочевидных моментов, про которые я сейчас скажу и которые отняли у меня время. Во-первых, советую просмотреть сразу все свойства файла конфигурации - http://wrapper.tanukisoftware.org/doc/english/properties.html. Чтоб знать что и как можно делать. Не забываем про установку нужных -Dname=value свойств для передачи значений JVM. И еще -- иногда хотелось бы запускать сервер в interactive-mode, чтобы при его старте открывалась консоль. Сделать это можно следующим образом - добавьте в конфиг враппера строчки wrapper.ntservice.console=true
wrapper.ntservice.interactive=true.

Но учтите - 
 Desktops created with the Remote Desktop tool do not appear to ever be
 accessible by interactive services.  Other tools which are actually 
 mirroring the  local desktop will have access as Windows thinks it is 
 rendering the local desktop. 
Ну и напоследок - коротко о фичах.
Можно составлять файл комманд, которые должны выполняться в определенное время, и указать
его в файле конфигурации враппера. Шедулинг работает нормально.
Можно писать хэндлеры консольного вывода, которые могут, например, перезапускать сервис, когда
падает некоторая ошибка (например, OufOfMemoryError).
Можно настраивать нотификацию администраторам на email.
...

Всем спасибо за внимание :)
Надеюсь, профессионалам Java это окажется небесполезным.


Tags: