JVM изнутри – организация памяти внутри процесса Java

Наверное, все, работающие с 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 - insufficient privileges внутри хранимой процедуры

Немного об одной тонкости в системе привилегий Oracle, о которой не все знают, и которая может съесть немало времени на отладку.

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

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

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

(no subject)

768-битный ключ RSA успешно взломан

Группе инженеров из Японии, Швейцарии, Нидерландов и США удалось успешно вычислить данные, зашифрованные при помощи криптографического ключа стандарта RSA длиной 768 бит. По словам исследователей, после их работы в качестве надежной системы шифрования можно рассматривать только RSA-ключи длиной 1024 бита и более. Все, что имеет длину ключа менее 768 бит уже можно взломать, правда к этому придется приложить определенные усилия полный текст

Источник: Cybersecurity.ru

JAXP - Сериализация с регулируемыми отступами

Как известно, JAXP позволяет сериализовать XML-ники через тождественную XSLT-
трансформацию. API для работы с XSLT из JAXP называется TrAX (говорящее само за себя
название, правда? :))),
Вот пример кода для сериализации с JAXP/TrAX:

Source domSource = new DOMSource(myDOMDocument);
Result fileResult = new StreamResult(new File("outputFile.xml"));
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer();
transformer .setOutputProperty(OutputKeys.OMIT_XML_DECLARATION,"no");
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.transform(domSource, fileResult);

И вот заодно полезная статья на IBM dev network:
http://www.ibm.com/developerworks/ru/library/x-xjavaforum5/index.html

Проблема в том, что файлы, которые генерит такой код, будут выглядить
примерно так -

<journals>
<opercard>
<operator>UNSET_VALUE</operator>
<date>UNSET_VALUE</date>
<cntnode>UNSET_VALUE</cntnode>
<cs>UNSET_VALUE</cs>
</opercard>
</journals>

Поскольку в классе OutputKeys нет стандартных свойств, с помощью которых
можно было бы управлять отступами.

Два решения, которые я нашел после долгого гугления -
trans.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
передача свойства дефолтной таблице стилей в транформере.

ИЛИ

TransformerFactory transfac = TransformerFactory.newInstance();
transfac.setAttribute("indent-number", 4);

Передача свойства реализации фабрики трансформера.

После такого хинта транформеру он будет выдавать readable XML вида
<journals>
    <opercard>
        <operator>UNSET_VALUE</operator>
        <date>UNSET_VALUE</date>
        <cntnode>UNSET_VALUE</cntnode>
        <cs>UNSET_VALUE</cs>
    </opercard>
</journals>

смутное время

http://www.youtube.com/watch?v=tUG0EkZAXDA
Наткнулся на ютубе на замечательный клип, Смутное время (одна из лучших на мой взгляд песен Кипелова), положенная на видеоряд из 300 спартанцев.
Фанаты Кипелова, смотрите! :)

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

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

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


Диплом Интернет-Университета Информационных Технологий: Основы программирования на языке Пролог