Search
Write a publication
Pull to refresh
0
@Vprokread⁠-⁠only

User

Send message

Опции JVM. Как это работает

Reading time7 min
Views96K
С каждым днем слово java все больше и больше воспринимается уже не как язык, а как платформа благодаря небезызвестному invokeDynamic. Именно поэтому сегодня я бы хотел поговорить про виртуальную java машину, а именно — об так называемых Performance опциях в Oracle HotSpot JVM версии 1.6 и выше (server). Потому что сегодня почти не встретить людей, которые знают что-то больше чем -Xmx, -Xms и -Xss. В свое время, когда я начал углубляться в тему, то обнаружил огромное количество интересной информации, которой и хочу поделится. Отправной точкой, понятное дело, послужила официальная документация от Oracle. А дальше — гугл, эксперименты и общение:

-XX:+DoEscapeAnalysis


Начну, пожалуй, с самой интересной опции — DoEscapeAnalysis. Как многие из Вас знают, примитивы и ссылки на объекты создаются не в куче, а выделяются на стеке потока (256КБ по умолчанию для Hotspot). Вполне очевидно, что язык java не позволяет создавать объекты на стеке на прямую. Но это вполне себе может проделывать Ваша JVM 1.6 начиная с 14 апдейта.

Про то, как работает сам алгоритм можно прочитать тут (PDF). Если коротко, то:

  • Если область видимости объекта не выходит за область метода, в котором он создается, то такой объект может быть создан на фрейме стека вместо кучи (на самом деле не сам объект, а его поля, на совокупность которых заменяется объект);
  • Если объект не покидает область видимости потока, то к такому объекту другие потоки не имеют доступа и следовательно все операции синхронизации над объектом могут быть удалены.


Для реализации данного алгоритма строится и используется так называемый — граф связей (connection graph), по которому на этапе анализа (алгоритмов анализа — несколько) осуществляется проход для нахождения пересечений с другими потоками и методами.
Таким образом после прохода графа связей для любого объекта возможно одно из следующих следующих состояний:

  • GlobalEscape — объект доступен из других потоков и из других методов, например статическое поле.
  • ArgEscape — объект был передан как аргумент или на него есть ссылка из объекта аргумента, но сам он не выходит из области видимости потока в котором был создан.
  • NoEscape — объект не покидает область видимости метода и его создание может быть вынесено на стек.


После этапа анализа, уже сама JVM проводит возможную оптимизацию: в случае если объект NoEscape, то он может быть создан на стеке; если объект NoEscape или ArgEscape, то операции синхронизации над ним могут быть удалены.

Следует уточнить, что на стеке создается не сам объект а его поля. Так как JVM заменяет цельный объект на совокупность его полей (спасибо Walrus за уточнение).

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

    for (int i = 0; i < 1000*1000*1000; i++) {
        Foo foo = new Foo();
    }

скорость выполнения может увеличится в 8-15 раз. Хотя, на казалось бы, очевидных случаях из практики о которых недавно писалось (тут и тут) EscapeAnalys не работает. Подозреваю, что это связано с размером стека.

Кстати, EscapeAnalysis как раз частично ответственен за известный спор про StringBuilder и StringBuffer. То есть, если Вы вдруг в методе использовали StringBuffer вместо StringBuilder, то EscapeAnalysis (в случае срабатывания) устранит блокировки для StringBuffer'а, после чего StringBuffer вполне превращается в StringBuilder.
Читать дальше →

Сборник полезных ссылок для системного администратора

Reading time2 min
Views190K
Думаю у каждого грамотного системного администратора есть коллекция ссылок на полезные в работе ресурсы. Я имею в виду различные сайты и блоги, на которых выкладываются полезные с точки зрения системного администратора посты.
Предлагаю ими поделиться в формате ссылка — описание.
Пример: habrahabr.ru — разнообразные статьи и новости на IT и около-IT тематику.

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

P.S. Хабр, опеннет и лор можно не упоминать. Можно выкладывать ссылки на конкретные статьи, если считаете их очень полезными.

Начну с себя (т.к я администрирую linux, то и ссылки у меня в основном соответствующие):
Читать дальше →

Избавляемся от дублирования сквозного кода в PHP: рефакторинг кода с АОП

Reading time12 min
Views44K
Думаю, каждому программисту знаком принцип единственной ответственности, ведь не зря он существует: соблюдая его, можно написать код лучше, он будет более понятным, его будет легче дорабатывать.

Но чем больше каждый из нас работает с кодом, тем больше приходит понимание того, что на существующем уровне языка — объектно-ориентированном — этого сделать невозможно. А мешает нам в соблюдении принципа единственной ответственности такой факт, как сквозная функциональность.

Эта статья о том, как можно избавиться от дублирования сквозного кода, и как сделать его чуточку лучше с помощью АОП.

Читать дальше

TOP'ай сюда

Reading time5 min
Views184K
Обзор практически всех *top утилит под linux (atop, iotop, htop, foobartop и т.д.).

top

Все мы знаем top — самую простую и самую распространённую утилиту из этого списка. Показывает примерно то же, что утилита vmstat, плюс рейтинг процессов по потреблению памяти или процессора. Совсем ничего не знает про загрузку сети или дисков. Позволяет минимальный набор операций с процессом: renice, kill (в смысле отправки сигнала, убийство — частный случай). По имени top суффикс "-top" получили и все остальные подобные утилиты в этом обзоре.

atop


Atop имеет два режима работы — сбор статистики и наблюдение за системой в реальном времени. В режиме сбора статистики atop запускается как демон и раз в N времени (обычно 10 мин) скидывает состояние в двоичный журнал. Потом по этому журналу atop'ом же (ключ -r и имя лог-файла) можно бегать вперёд-назад кнопками T и t, наблюдая показания atop'а с усреднением за 10 минут в любой интересный момент времени.

В отличие от top отлично знает про существование блочных устройств и сетевых интерфейса, способен показывать их загрузку в процентах (на 10G, правда, процентов не получается, но хотя бы показывается количество мегабит).

Незаменимое средство для поиска источников лагов на сервере, так как сохраняет не только статистику загрузки системы, но и показатели каждого процесса — то есть «долистав» до нужного момента времени можно увидеть, кто этот счастливый момент с LA > 30 создал. И что именно было причиной — IO программ, своп (нехватка памяти), процесор или что-то ещё. Помимо большего количества информации ещё способен двумя цветами подсказывать, какие параметры выходят за разумные пределы.
Читать дальше →

Программируем на праздниках в Windows 8

Reading time2 min
Views23K
Новогодние праздники — традиционное время, когда многие разработчики по всей России радуются свободному времени и думают, что бы такого попрограммировать. Лично я живу с таким ощущением уже который год.
Поэтому решил в одном посте собрать ссылки на материалы, которые помогут начать создавать приложения для Windows 8.

Прежде всего это бесплатные электронные книги.
На русском — Разработка приложений для Windows 8 на языке C#
На английском — Programming Windows 8 Apps with HTML, CSS, and JavaScript

В одном месте — все ссылки для разработчиков, включая Windows 8, SDK и дополнительные библиотеки.
Читать дальше →

Простая проверка безопасности на ваших серверах

Reading time1 min
Views30K
Всем привет!

Предлагаю сделать простую проверку безопасности на ваших серверах.

Суть проверки очень проста. Мы переключаемся под пользователя, из-под которого запущены сервисы, такие как вебсервер или база данных, и смотрим в какие файлы в системе он может читать и писать. Запускать надо из-под всех пользователей, из-под которых работают смотрящие в мир сервисы. Если раньше никогда не делали, могут открыться бездны, но не паникуйте и быстренько все поправьте.

Замечу, что например апачевский юзер не должен иметь прав на изменение и удаление апачевских логов.

С Новым Годом!
А как проверить то?

Как устроены массивы в PHP

Reading time6 min
Views75K
В прошлой статье я рассказывал о переменных, теперь пойдет речь о массивах.

Что такое массивы на уровне PHP?


На уровне PHP, массив — это упорядоченный список скрещенный с мэпом. Грубо говоря, PHP смешивает эти два понятия, в итоге получается, с одной стороны, очень гибкая структура данных, с другой стороны, возможно, не самая оптимальная, точнее, как выразился Anthony Ferrara:
PHP arrays are a great one-size-fits-all data structure. But like all one-size-fits-all <anything>, jack-of-all-trades usually means master of none.

Ссылка на письмо



(на картине изображен HashTable с Bucket-ами, В. Васнецов)
Читать дальше →

10 трюков в командной строке, о которых вы не знали. Честное слово.

Reading time5 min
Views21K

1. Простой способ перехватить вывод и ошибки


Хотите направить stdout и stderr в один файл?
command &> file
Может вы разбираетесь в некой программе при помощи strace, и желали бы видеть системные вызовы вместе с ошибками программы?
strace badapp &> errors_and_output

Плюсы: легко запоминается, и проще чем
Читать дальше →

Как устроены переменные в PHP

Reading time3 min
Views65K
Вроде простой вопрос, даже не понятно что на него ответить, правда?
Мы все знаем как создать переменную, как получить значение переменной, как взять ссылку на переменную в конце концов.
Но как они работают изнутри?
Что происходит в интерпретаторе, когда вы изменяете значение переменной? Или когда удаляете ее?
Как реализованы типы переменных?

В этой статье я постараюсь раскрыть именно эти темы.

Abstract

Переменные в PHP выражены в виде неких контейнеров, которые хранят в себе тип переменной, значение, кол-во ссылающихся переменных на этот контейнер, и флаг — является ли эта переменная ссылочной.
Немного запутанно, но под катом станет понятней

Phalcon — скомпилированный PHP MVC Framework

Reading time7 min
Views56K

Создание скомпилированных MVC фреймворков для PHP не раз приходила на ум кодерам.

Достоинства такого подхода:
  • Высокая производительность
  • Малая нагрузка файловой системы
  • Меньший расход памяти (при строгой типизированности)
  • Частичная обработка данных без интерпритации

И само собой не менее явные недостатки:
  • Если Вы не знаете C, то Вы полностью зависите от разработчиков
  • Проект может в любую секунду сдуться
  • В зависимости от архитектуры, часть модулей все равно приходится писать самому, что уменьшает выигрыш

Читать дальше

Последний Я.Субботник года: Санкт-Петербург

Reading time1 min
Views2.1K
1 декабря 2012 года в Санкт-Петербурге пройдет завершающий этот год Я.Субботник.

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



Приходите, слушайте, задавайте вопросы и общайтесь на профессиональные темы за чашкой кофе.

Программа и тезисы Я.Субботника

Читать дальше →

Puppet под нагрузкой

Reading time6 min
Views33K
Puppet — довольно удобный инструмент для управления конфигурациями. По сути, это система, которая позволяет автоматизировать настройку и управление большим парком машин и сервисов.

Базовой информации о самой системе много, в том числе и на Хабре: здесь, здесь и здесь. Мы же постарались собрать в одной статье несколько «рецептов» использования Puppet под действительно большими нагрузками — в «боевых условиях» Badoo.

О чём пойдет речь:

  • Puppet: ликбез;
  • кластеризация, масштабирование;
  • асинхронный Storeconfigs;
  • сбор отчётов;
  • анализ полученных данных.

Читать дальше →

Барьеры доступа к памяти в Linux

Reading time15 min
Views49K
Эта статья — частичный перевод исчерпывающего руководства Дэвида Хоуэлса (David Howells) и Пола Маккени (Paul E. McKenney) распространяемого в составе документации Linux (Documentation/memory-barriers.txt онлайн версия).

Must read для разработчиков ядра/драйверов и очень познавательно для прикладных программистов.
ASCII art и очень много букв

Свое облако, в 10-15 раз дешевле Amazon EC2

Reading time3 min
Views59K
Заголовок получился достаточно желтый, но он лучше всего передает суть поста: можно создать свое вычислительное облако, которое будет на порядок дешевле, чем предлагает Amazon EC2. Есть множество нюансов, из-за которых подобное “дешевое облако” может не подойди, но, на мой взгляд, для многих задач оно вполне подходит и справляется с ними отлично.

Далее я хочу рассказать о нашем опыте использования OpenStack, развернутого у Hetzner’a, и привести расчеты стоимости подобного облака.
Читать дальше →

Wi-Fi: неочевидные нюансы (на примере домашней сети)

Reading time14 min
Views1.4M
Сейчас многие покупают точки доступа 802.11n, но хороших скоростей достичь удается не всем. В этом посте поговорим о не очень очевидных мелких нюансах, которые могут ощутимо улучшить (или ухудшить) работу Wi-Fi. Всё описанное ниже применимо как к домашним Wi-Fi-роутерам со стандартными и продвинутыми (DD-WRT & Co.) прошивками, так и к корпоративным железкам и сетям. Поэтому, в качестве примера возьмем «домашнюю» тему, как более родную и близкую к телу. Ибо даже самые администые из админов и инженеристые из инженеров живут в многоквартирных домах (или поселках с достаточной плотностью соседей), и всем хочется быстрого и надежного Wi-Fi.
[!!]: после замечаний касательно публикации первой части привожу текст целиком. Если вы читали первую часть — продолжайте отсюда.
Читать дальше →

Я переучиваю людей на Java-программистов

Reading time8 min
Views135K

Когда я вижу друзей, которые вкалывают в два раза больше, а зарабатывают в четыре раза меньше, каждый раз начинается разговор:
— А ты бы не хотел поработать программистом? Ты же реально умный. Может ты просто не на своем месте?

В результате я переучиваю своих друзей и знакомых на программистов. Весь процесс занимает от двух до трех месяцев. 25 уроков по 4 часа. Потом все смогли устроиться программистами.
Эта статья не о том, как надо учить, скорее просто описание процесса, который работает.
Читать дальше →

Костыльный программист

Reading time5 min
Views50K
Автор: Джоэль Спольски. Оригинал.

Статья посвящена оверинженирингу и тем, кто предпочитает старые костыльные решения лишь потому, что они очень просты. Перевод под катом.
Читать дальше →

Повышаем безопасность стека web-приложений (виртуализация LAMP, шаг 1/6)

Reading time5 min
Views11K

Настройка доступа web-сервера Apache/Lighttpd/Nginx к файлам сетевой файловой системы (NFS)


Мы продолжаем переводить серию уроков о виртуализации и настройке LAMP сервера с сайта www.cyberciti.biz и переходим к первому практическому шагу — созданию сетевого хранилища файлов

Создание хранилищ общего сетевого доступа NFSv4.0 (Network File System) в ОС Linux и Unix не сильно отличается от создания иных общих сетевых ресурсов Apache/Lighttpd/Nginx. Для этого произведем следующие настройки нашего файлового сервера/VM vm05 с IP-адресом 192.168.1.14.
Читать дальше →

Я не знаю ООП

Reading time12 min
Views554K
Я не умею программировать на объектно-ориентированных языках. Не научился. После 5 лет промышленного программирования на Java я всё ещё не знаю, как создать хорошую систему в объектно-ориентированном стиле. Просто не понимаю.

Я пытался научиться, честно. Я изучал паттерны, читал код open source проектов, пытался строить в голове стройные концепции, но так и не понял принципы создания качественных объектно-ориентированных программ. Возможно кто-то другой их понял, но не я.

И вот несколько вещей, которые вызывают у меня непонимание.
Читать дальше →

Как определить язык по виду иероглифов/закорючек?

Reading time1 min
Views195K
Вот, задался таким вопросом… С помощью гугл транслейта и такой-то матери, родилась такая блок-схемка:



картинка кликабельна

Кому нужен сорец (в .docx): тут

Information

Rating
Does not participate
Location
Россия
Registered
Activity