My name is Vasyl Khrystiuk‎ > ‎process‎ > ‎main‎ > ‎

profiling

Факт: линукс УБИВАЕТ приложения, которые едят больше памяти чем есть в системе:


Первое правило:
Линукс УБИВАЕТ ПРОЦЕССЫ, КОТОРЫЕ МНОГО ЕДЯТ ОПЕРАТИВЫ.
Как я об этом узнал?) 
Ну я вечером такой запустил сервер, лег спать, утром просыпаюсь, а он не отзывается, я захожу, а процесс убит. Кто его убил? Сервак чист - система установлена только вчера, софта не то что левого, вообще никакого не было, коме собственно моего сервера. Ну это правда помогло - ведь понятно, что процесс могла убить только система, и да, один правильный запрос в гугл меня привел к нужной информации:
Т.е. это нормально.
Вот, чтобы убедится в этом что со мной это произошло - можно посмотреть системный лог:
>sudo cat  /var/log/kern.log
Oct 16 17:37:38 ip-10-140-30-164 kernel: [1703976.864473] [16103]     0 16103   392957   129134   0       0             0 java
Oct 16 17:37:38 ip-10-140-30-164 kernel: [1703976.864477] Out of memory: Kill process 16103 (java) score 827 or sacrifice child
Oct 16 17:37:38 ip-10-140-30-164 kernel: [1703976.864493] Killed process 16103 (java) total-vm:1571828kB, anon-rss:516536kB, file-rss:0kB

Правда, если посмотреть использование памяти в линуксе, то там есть два показателя - rrs(Resident Set Size) и total_vm(VSZ, Virtual Memory Size), на эту тему можно нагуглить много инфы, но чтоб не вдаваться в подробности - rrs это та часть памяти процесса, что находится непосредственно в оперативной памяти, а виртуальная память  - та же самая, что и у виндовсе(я знаю какая это а пишу все это я в первую очередь для себя, по поводу таких вопросов, как учет shared libraries и nenory mapped files - если уж очень интересно - гугли снова и пиши сюда). Вот хорошая статья на эту тему: http://www.opennet.ru/base/sys/pmap_memory.txt.html
 
Итак, продолжим с OOM Killer-ом. Эта проблема настолько популярная в яве, то мануал по настройке этой фичи можно найти в первой выдаче гугла сразу на оракловском сайте:
А вот тут по простому, по русскому и с указанием дефолтных настроек: http://catap.ru/blog/2009/05/03/about-memory-oom-killer/   http://catap.ru/blog/2009/05/05/about-memory-overcommit-memory/ (ссылки разные

И раз уже за это пошел разговор, то давайте заодно посмотрим, из какой же памяти состоит явапроцесс. Впрочем, об этом есть очень наглядная статья:






// TODO: Що це таке?

Завжди було цікаво, як в яві виконується профілювання. Я собі записав це питання в TODOLIST  і коли-небудь прийшов би до нього(бо всетаки  TODOLIST не стоїть на місці =) ). 
Але випадковість як завжди привела мене до цього питання раніше.
Отож для початку давайте познайомимось з java.lang.instrument.Instrumentation. Нічого не зрозуміло? Мені теж =)
Тепер підем сюди:
Це хороша стаття яка описує проблему, але запропонований там агент недосконалий. Хороший агент можна знайти тут:
Можна написати утиліту, яка б слідкувала за пам'яттю об'єктів. Але вона вже написана: 

І ось мій варіант використання(готовий проект):
// TODO:

Більше інформації тут:




Comments