Источник: Java Perfomance (Hunt & John, 2011) Виртуальные машины Java используют исключения в качестве сигнала о том, что программа нарушила некие семантические ограничения языка. Например, попытка получить доступ к индексу за пределами массива вызовет ошибку. Исключение провоцирует нелокальное перемещение контроля из точки возникновения или “выброса”, в точку, которая была определена...
Continue reading...Java
Типы опций командной строки для запуска виртуальной машины Java
Источник: Java Perfomance (Hunt & John, 2011) Существует три типа опций командной строки: стандартные, нестандартные и опции разработчиков. Стандартные опции могут использоваться в любой реализации JVM, как того требует the Java Virtual Machine Specification. Они остаются неизменными от релиза к релизу, однако могут стать deprecated в релизах, следующих за тем,...
Continue reading...Integer Cache в Java
Для оптимизации потребления памяти некоторые классы-оболочки в Java (например Integer, Byte, Short, Long и Character ) кэшируют значения в ограниченном диапазоне (чаще всего от -128 до 127). Покопавшись в исходниках JDK, можно отыскать внутренний статический класс IntegerCache: В Static-блоке инициализируется массив cache, он заполняется объектами Integer со значениями от -128...
Continue reading...Многопоточность в Java: Hardware
Это – перевод статьи “Threading in Java. Part II. Hardware” автора Beka Kodirov. Первая часть статьи находится здесь. Расскажите об иерархии кэшей L1/L2/L3? Зачем они нужны? Кэши L1/L2/L3 это сегменты памяти, в чем-то схожие с RAM. Это быстрая память небольшого объёма, которая используется для уменьшения времени доступа процессора к данным...
Continue reading...Не-атомарность i++, volatile и synchronized
Постфиксный инкремент в Java не является атомарным. Это означает, что в реальности за вызовом i++ скрывается несколько последовательных операций. Переменная сперва считывается из памяти, затем увеличивается на единицу, а результат снова записывается в память. При использовании операции в многопоточном окружении эта особенность может привести к нежелательным последствиям. Если несколько потоков...
Continue reading...hashCode() и equals(): нарушить (,) нельзя (,) соблюдать
Второй по популярности (после различий между LinkedList и ArrayList) вопрос на собеседованиях – контракт между методами hashCode() и equals(). Метод hashCode() класса Object – нативный (то есть написан не на Java и вызывается с помощью JNI). Из сигнатуры следует, что хэш-код является некоторым целочисленным значением типа int. Полагаю, что реализация...
Continue reading...“String pool в Java” или почему не надо сравнивать строки при помощи “==”
Разбирая недавно старый код, доставшийся мне по наследству на одном из проектов, я наткнулся на дефект, который отнял у меня добрую часть рабочего дня. Ошибка была самым настоящим heisenbug’ом: несколько лет этот код успешно работал в продукционной среде и дефект вышел из тени только при миграции на новую версию одного тяжеловесного JEE-совместимого сервера приложений.
Continue reading...