Правила "Не забудь!"


  1. при добавленні нових полів до класу звернути увагу на методи hashCode(), equals() та compareTo(), - може слід добавити і туди обробку нового поля

  2. при добавленні поля типу колекції, - надати їй початкове значення

  3. перечитати той код, що ти написав

  4. протестувати те, що ти закодував чи перекодував

  5. може це можна було зробити по інакшому? якщо так, то як? а чим воно краще?

Java call stack for simple web application

Interesting to see the call stack of simple action on web application written on Java, isn't it?
I found the blog story with picture of call stack from HTTP to JDBC. Here it is..

It is beautiful. A long path and only two calls to the application business and DAO methods. Comments are very interesting too.
They are from PHP developers, from administrators etc.

Зміни в блозі

В результаті вивчення суті блогів, статистики блогу та власних побажань, я міняю суть даного блога із суто джавового на суто компютерний із основною орієнтацією на джаву.

Також частина блогів буде на англійській мові. Для чого це потрібно? Мабуть, для того, щоб потренуватися писати статті на англійській мові. Знадобиться ))

BlazeDS: фільтрування повідомлень, що передаються клієнтові

Останні два тижні знашовся час трохи побавитися із Flex та BlazeDS. Основна задача - знайти способи передачі повідомлень від сервера до клієнта, так, щоб клієнт отримував тільки повідомлення, на які він підписався.
Задача - розглянути можливі варіанти. Можливі варіанти були вибрані, а саме:

  • Subtopics

  • Selectors

  • Adaptive polling

  • Dynamic destinations


Може є більше, але це ті, до яких я добрався і з якими я погрався.

Взагалі то, subtopics та selectors можна би було об'єднати, от тільки між ними є невеличка різниця. Використовуючи selectors, можна задати більш гнучку умову вибору повідомлень, які повинень отримувати consumer. Але зрешту, є така річ як MultiTopicsConsumer. Перевірка на те, чи слід віправляти повідомленння клієнту в залежності від підписки на сабтопік чи вибірку по хедерах, виконується на стороні сервера. Іншими словами, до клієнта приходять тільки окремі повідомлення із тих, що вислані на підписаний ним destination. Клієнт отримує повідомлення, що задовільняють необхідну умову.

Adaptive polling дозволяє розширювати функціональність BlazeDS, що відповідає за відправлення повідомлення клієнтові. Тут також слід правильно вибрати, який саме із двох презавантажених методів використовувати у вашому випадку.
Цей метод, дозволяє виконувати необхідну вам дію на повідомленнями, що передаються клієнтові. Тут ми і можемо виконувати гнучку і складну вибірку повідомлень, що ми будемо відправляти клієнтові.

За останнім способом (dynamic destinations) я виконував динамічне створення окремого destination на ту чи іншу розсилку в процесі роботи сервера. А клієнти вже підписувалися на динамічну розсилку. Явні мінуси: це ресурси на створення нової підписки (які не є вже аж такими великими, щоб вважати це проблемою), а також необхідність відстежувати життя підписки та знищувати її якщо вона вже непотрібна.

Новини: 07 червня


  • В реліз вийшла нова версія Spring Security під номером 2.0.2. Детальніше...

OutOfMemoryError: PermGen

Десь кілька місяців тому виявилося, що в проекті, над яким я працюю, знайшлася потворна бага. Відловити її було неможливо. В будь-який момент працювати з програмою ставало неможливо. В логах вивалювалася помилка OutOfMemoryError: PermGen.

Звичайно, я з цим не вперший раз стикаюся, і вирішив спробувати старий добрий спосіб - прописати параметр до Джава машини -XX:MaxPermSize. Отже, прописавши параметр -XX:MaxPerSize=256m, я запустив JBoss. І що? А нічого. Все одно програма вивалювалася... Так само непердбачувано і неочікувано :(.

Тоді я вирішив спробувати ще раз, але цього разу збільшив память для PermGen space вдвічі: -XX:MaxPerSize=512m. Особливо це мені не допомогло, добитися впевнених 24/7 так і невийшло. І було вирішено, що слід ритися вглубь, не виправляти проблему, а викорінити причину!
Порившись в інтернеті я надибав блог by Frank Kieviet, в якому розповідалося про використання утиліт для Java 6: jmap та jhat.

jmap - дозволяє створювати дампи пам'яті Java програми.
jhat - дозволяє представити інформацію дампа у зручному для користувача вигляді.

Отож, використовуючи jmap я зробив дамп heap пам'яті запущеної програми в процесі її роботи. Я виконав команду

>jmap -dump:format=b,file=dump1 3412

цим самим вказавши, що слід виконати дамп пам'яті програми, зберегти її в бінарному форматі у файлі dump1. 3412 - це pid Java програми, дамп пам'яті якої я робив. Для того, щоб отримати ідентифікатор процесу, у Windows введіть команду tasklist і знайдіть відповідний java.exe процес.

Після того, як в мене вже був збережений у файлі дамп, я скористався програмою jhat. Команда:

>jhat dump1

проаналізувала дамп і запустила веб-сервер, який по-замовчуванню слухає запити на порті 7000. Якщо потрібно буде одночасно запустити декілька jhat, то знайте - адрес порта можна змінити відповідним параметром. Слід також звернути увагу на параметр -J. Всі параметри, які задаються після -J потрапляються напряму до Java машини. В моєму випадку це знадобилося для того, щоб збільшити максимальну межу пам'яті, яку можна виділити. У випадку програми, яка працювала під JBoss AS 4.0.4, я змушений був запускати jhat компандою
>jhat -J-Xmx1536m dump

Після старту jhat, можна спокійно відкривати ваш олюблений броузер, і вводити адрес http://localhost:7000/. Тепер можна переглядати дамп пам'яті програми, використовуючи набір функціоналу, який надається програмою.

Скориставшися цією програмою, я визначив причину моєї проблеми – не всі динамічно генеровані класи вигружалися; декотрі з них так і залишалися назавжди в пам'яті. Оскільки, PermGen Space (Permananent Generated Space) - це простір в пам'яті, в якому знаходяться довгоживучі (або вічноживучі в межах запущеної java-машини) об'єкти, а серед таких є класи та 'interned strings', то зрозуміло, що суть моєї проблеми в тому, що декотрі динамічно генеровані класи продовжували генеруватися, завантажуватися в пам'ять, але навідмінно від інших, вони залишалися там навічно. Рано чи пізно вільна пам'ять завершувалася, і програма уходила в аут із знойним повідомленням "OutOfMemoryError: PermGen".

Але лікування цієї проблеми це вже зовсім інша історія... І наразі вона ще не закінчилася :(.