l8_nc
.pdfУборка мусора а Java
Слабая гипотеза о поколениях
•Постулаты
•Большинство объектов умирают молодыми
•Число ссылок на молодые объекты мало
•Следствие – хранить и обслуживать молодые и старые объекты раздельно
•Молодое поколение – сборщик мусора настроен на производительность
•Старое поколение – сборщик настроен на компактное хранение
•Продвижение – перекинуть из молодых в старые при достижении возраста зрелости.
© 2013 NetCracker Technology Corporation Confidential |
31 |
Устройство памяти в Java
•http://www.slideshare.net/aragozin/java-9545575
•http://habrahabr.ru/post/112676/
© 2013 NetCracker Technology Corporation Confidential |
32 |
КПДВ
«Если бы в Java действительно
работала сборка мусора, большинство
программ бы удаляли сами себя при первом же запуске.»
Robert Sewell. Программист.
© 2013 NetCracker Technology Corporation Confidential |
33 |
Профайлинг
HPROF -Heap Profiler
© 2013 NetCracker Technology Corporation Confidential |
34 |
Недостатки профайлера
•Профайлер знает о вашем приложении гораздо меньше, чем вы
•Профайлер профилирует каждый вызов
•Профайлер может вносить сильную погрешность и даже менять картину в целом
• Использование |
знакомство с ним |
© 2013 NetCracker Technology Corporation Confidential |
35 |
Heap Allocation Profiles (heap=sites)
java -agentlib:hprof=heap=sites Interpretator 1.a
THREAD START (obj=50000173, id = 200002, name="HPROF gc_finish watcher", group="system") THREAD START (obj=50000173, id = 200001, name="main", group="main")
THREAD END (id = 200001)
THREAD START (obj=50000174, id = 200003, name="DestroyJavaVM", group="main") THREAD END (id = 200003)
TRACE 300000: <empty> TRACE 300001:
java.lang.Thread.<init>(<Unknown Source>:Unknown line) TRACE 300002:
java.lang.Thread.<init>(<Unknown Source>:Unknown line) TRACE 300003:
java.lang.String.toCharArray(<Unknown Source>:Unknown line) java.lang.Thread.init(<Unknown Source>:Unknown line) java.lang.Thread.<init>(<Unknown Source>:Unknown line)
TRACE 300004:
java.lang.AbstractStringBuilder.<init>(<Unknown Source>:Unknown line) java.lang.StringBuilder.<init>(<Unknown Source>:Unknown line) sun.misc.PostVMInitHook.trackJavaUsage(<Unknown Source>:Unknown line) sun.misc.PostVMInitHook.run(<Unknown Source>:Unknown line)
… |
|
|
|
|
|
|
|
|
percent |
live |
|
alloc'ed stack class |
|
||||
rank |
self |
accum |
bytes objs |
bytes |
objs trace name |
|||
1 |
8.66% |
8.66% |
49728 |
12 |
49728 |
12 |
300142 |
byte[] |
2 |
5.65% |
14.32% |
32464 |
152 |
32464 |
152 |
300006 |
char[] |
3 |
4.29% |
18.60% |
24624 |
3 |
24624 |
3 |
300596 |
byte[] |
4 |
2.86% |
21.46% |
16400 |
1 |
16400 |
1 |
300386 |
char[] |
5 |
2.86% |
24.32% |
16400 |
1 |
16400 |
1 |
300706 |
char[] |
6 |
2.13% |
26.45% |
12240 |
45 |
12240 |
45 |
300583 |
boolean[] |
7 |
1.43% |
27.88% |
8208 |
1 |
8208 |
1 |
300384 |
byte[] |
8 |
1.43% |
29.31% |
8208 |
1 |
8208 |
1 |
300914 |
byte[] |
9 |
1.32% |
30.63% |
7568 |
2 |
7568 |
2 |
301052 |
int[] |
© 2013 NetCracker Technology Corporation Confidential |
36 |
CPU UsageTimes Profile (cpu=times)
CPU TIME (ms) BEGIN (total |
= 280) Sun Sep 22 21:36:21 2013 |
||||
rank |
self |
accum |
count |
trace method |
|
1 |
2.50% |
2.50% |
9 |
300589 |
java.io.Win32FileSystem.normalize |
2 |
2.14% |
4.64% |
449 |
300584 |
java.lang.AbstractStringBuilder.append |
3 |
2.14% |
6.79% |
429 |
300509 |
java.lang.StringBuilder.append |
4 |
1.79% |
8.57% |
429 |
300604 |
java.lang.CharacterDataLatin1.toLowerCase |
5 |
1.79% |
10.36% |
9 |
300609 |
java.lang.String.toLowerCase |
6 |
1.43% |
11.79% |
1 |
302043 |
|
sun.nio.fs.WindowsChannelFactory.newFileChannel |
|||||
7 |
1.43% |
13.21% |
858 |
300618 |
java.lang.String.charAt |
8 |
1.07% |
14.29% |
6 |
301312 |
java.lang.ClassLoader.defineClass |
9 |
1.07% |
15.36% |
50 |
300141 |
|
java.util.concurrent.locks.ReentrantLock$Sync.nonfairTryAcquire |
|||||
10 |
1.07% |
16.43% |
429 |
300603 |
java.lang.CharacterDataLatin1.getProperties |
© 2013 NetCracker Technology Corporation Confidential |
37 |
JVisualVM
© 2013 NetCracker Technology Corporation Confidential |
38 |
Другие средства
•Отладочная печать – служит разработчикам ПО с 60-х годов прошлого века
•Thread stack sampling (kill -QUIT PID)
•BTrace – аналог DTrace для JVM
•Самостоятельная расстановка вызовов профилирования в коде (вызовы JAMon, запись данных во внешнее хранилище для постобработки, статистическая предобработка)
© 2013 NetCracker Technology Corporation Confidential |
39 |
Суровая правда жизни
•Не надейтесь найти в корпорации документацию. Исходя из того, что мне довелось видеть — все знания в компании передаются в основном посредством разговоров и мастер-классов. Часть доступной информации передается по электронной почте и вообще нигде не сохраняется. В остальном мире сейчас так не принято — ведь если кого-то вдруг нечаянно собьет автобус, то никто другой не сможет легко взять и продолжить его работу (например, сесть и сразу писать дальше код). И тут это считается нормой. Если бы у меня была компания, то я бы предпочел иметь вики на тысячи страниц.
•Важно не то, что ты сделал — важно то, что ты продал. Можно днями улучшать свой код и править чужие ошибки, но пока это не оказывает никакого влияния на продажи и результат усилий невозможно продать — ваша работа практически ничего не значит. Никого не интересуют ваши правки кода в погоне за его чистотой или стилистическим единством; никого не интересует и решение проблем с архитектурой. На вас даже могут обидеться, если вы будете заниматься подобным. Когда я был студентом, мне не это рассказывали.
•Не всем есть дело до программирования. Вы не всегда будете работать с теми, кто нежно любит разработку софта. У большинства людей здесь есть в жизни что-то еще (семья, дети), поэтому стремление написать чистый код чаще всего не входит в их планы. И это нормально. Я научился не ждать энтузиазма от всех и каждого.
•2-3 часа чистого кодинга в день — это замечательная цифра. До того, как я попал на свою работу, я
программировал 8-10 часов каждый день, сидя за своими проектами. А в новом окружении у меня едва удается писать код 2 часа кряду. Большую часть своего времени я провожу в попытках понять, как работает чужой некомментированный/недокументированный код, занимаюсь отладкой странного поведения программ и посещаю ежедневные собрания. Все сказанное касается не только меня, поэтому случается, что проходят дни без единого коммита во всей команде. И это тоже нормально.
•Суть в том, чтобы делалось дело. Если менеджер просит вас о кнопке, которая будет делать то-то и это, то никого не интересует, чего вы там наворотите. Когда запрошенная функция начинает работать, можно считать, что задача выполнена — все остальное можно будет поправить потом. Хотя, честно говоря, сам-то я с этим обещанным «потом» никогда так и не сталкивался. В колледже мне говорили, что качество кода так же важно, как и сам результат его работы. Тут оказалось, что это не так.
Чему я научился за 8 месяцев в Microsoft http://habrahabr.ru/post/183130/
© 2013 NetCracker Technology Corporation Confidential |
40 |