Обновить
256K+

Java *

Объектно-ориентированный язык программирования

259,61
Рейтинг
Сначала показывать
Порог рейтинга
Уровень сложности

Этюд для программиста или головоломка крисс–кросс

Время на прочтение8 мин
Охват и читатели30K

Думаю многим хабровчанам знакома книга «Этюды для программистов» Чарльза Уэзерелла. Если нет, то здесь можно прочитать интервью с автором и небольшой обзор книги. Мне самому совсем недавно попала данная вещь в руки, и было решено обязательно реализовать одну из задачек.

Итак предлагаю разобрать с вами один из этюдов. Писать будем на Java, поработаем с графикой и GUI + разберем алгоритм перебора с возвратом для нахождения нашего решения. Маловероятно, что статья заинтересует профи, но вот новичкам, а особенно тем, кто только изучает Java, статья может оказаться полезной.
Всем заинтересовавшимся – добро пожаловать!
Читать дальше →

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

Время на прочтение7 мин
Охват и читатели100K
С каждым днем слово 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.
Читать дальше →

Реализация системы скинов в Android-приложении или смена цветовой гаммы в один клик

Время на прочтение6 мин
Охват и читатели14K
Приветствую всех хабравчан!

Совсем недавно реализовывала интересную, на мой взгляд, задачу в андроид приложении и решила поделится опытом с вами.
Задача заключается в следующем: смена цветовой гаммы приложения по одному клику. Так называемая реализация скинов для приложения.

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

Откуда растут ноги у hashCode

Время на прочтение2 мин
Охват и читатели91K
Опять на собеседованиях по Java спрашивают про hashCode и equals? А кто из собеседующих сам ответит на вопрос, как вычисляется Object.hashCode() и System.identityHashCode()? Насколько дорог вызов этих методов? Как их можно ускорить в HotSpot JVM? Держу пари, едва ли кто даст правильный ответ. Разве что, кто прочитает эту статью.
Читать дальше →

Тюним клавиатуру правильно

Время на прочтение4 мин
Охват и читатели41K

Добрый день друзья, хочу сразу высказаться: данная статья моего друга, который хотел её опубликовать, но по ошибке отправил в песочницу не доделанную, и более не смог выложить нормальный вариант, попросил об этом сделать меня. Лично для меня статья очень полезная, так что весь этот труд исключительно blide!

Играя в Team Fortess 2 и при этом слушая музыку, я сильно негодовал из-за невозможностью регулировки громкости проигрывателя Clementine отдельно от общей громкости. Но лишних клавиш на клавиатуре у меня нет, все используются.

Нетривиальная задача должна иметь нетривиальное решение, поэтому я решил сделать эмуляцию нажатия клавиш через мое android-устройство посредствам http. Незнание Java и Python ничем не помешало, не спроста же у меня на жёстком диске есть ext3-раздел.
Читать дальше →

Новая уязвимость нулевого дня в браузерных плагинах Java

Время на прочтение1 мин
Охват и читатели23K
Похоже, месяц уязвимостей zeroday продолжается.

Очередная уязвимость в Java (CVE-2013-0422) уже включена в несколько эксплоит паков (BlackHole Exploit Kit, Cool Exploit Kit, Nuclear Pack). Вот что пишет создатель эксплоит пака BlackHole Exploit Kit:


Сообщается, что эта уязвимость очень похожа на обнаруженную в августе уязвимость в Java CVE-2012-4681. Атакующий может создать зловредную веб страницу и выполнить произвольный код на уязвимой системе. Работает на последней на текущий момент версии Java 1.7u10

Создатель Metasploit сообщил, что в ближайшее время в этот фреймворк будет включена описываемая уязвимость (уже выпустили, спасибо timukas). Напомнив, что уязвимость может работать независимо от ОС где установлена Java. Будь то Windows, Linux или MacOS.
Читать дальше →

Самопальная привязка С++ классов к JVM через JNI

Время на прочтение3 мин
Охват и читатели9.2K
Так получилось, что недавно на работе мне понадобилось портировать старенькое нативное приложение под Android. Приложение написано в основном на C/C++. Захотелось мне это проделать грамотно и цивилизованно. Собственно об этом под катом
Читать дальше →

JS модуль для Java разработчиков

Время на прочтение7 мин
Охват и читатели9.5K
Во всем мире объем используемого JS кода в приложениях растет очень сильно, что уже неоднократно подчеркивалось, посмотреть картинки на эту тему можно например тут или тут. Соответственно с ростом количества кода возникает необходимость структурирования данных, управления зависимостями и проч., которые на данный момент решает целый букет фрэймворков, например RequireJS в композиции с Backbone. С другой стороны в мире Java для управления зависимостями и контроля процесса сборки проекта используется Maven, который отлично справляется с задачей разделения больших проектов на модули, запуска тестов в нужное время и т.д. У некоторых разработчиков, уже давно использующих Maven для сборки проекта, может возникнуть желание вынести свой отлично структурированый JS код в отдельный модуль, тестировать его во время сборки и совершать с ним все операции, которые позволяют делать плагины, о чем и пойдет речь.
Читать дальше →

Одна маленькая оптимизация

Время на прочтение2 мин
Охват и читатели38K
Совсем недавно со мной поделились историей одной оптимизации (привет stanislaw), которая показалась мне довольно забавной.

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

for (A a : arrayListA) { 
    // do something
    for (B b : arrayListB) {
        // do something
        for (C c : arrayListC) {
            // do something
        }
    }
}

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

image

И при частых вызовах метода сборка занимала довольно большую часть времени работы метода.
Читать дальше →

Jelastic Cloud + Maven. Часть 1

Время на прочтение4 мин
Охват и читатели5K
Что такое Jelastic Cloud? это облачный java-хостинг, а с некоторых пор и php-хостинг, который поддерживает такие сервера приложений как Tomcat 6/7, Jetty 6, Glassfish 3, среду выполнения Java 6/7, а так же БД MariaDB 5.5, MySQL 5.5, PostgreSQL 8.4, MongoDB 2.0 и CouchDB 1.2 (версии указаны на момент публикации поста). Более подробно можно узнать у них на сайте.

Мы же поговорим про создание и загрузку java web-приложения в cloud-окружение посредством maven-плагина от Jelastic.

В первой части мы создадим окружение в облаке и создадим простой web-проект, который и установим в окружение.
Читать дальше →

Шифруются? Вытаскиваем байткод из JVM

Время на прочтение5 мин
Охват и читатели26K


Привет, хабр. Я пишу на языке Java, занимаюсь, преимущественно, работой с серверами MMORPG игр. Серверные «сборки» выпускаются многими командами, работающими в этой сфере. Некоторые платно, а некото
Читать дальше →

Курс программирования под Android для начинающих

Время на прочтение1 мин
Охват и читатели84K


Организация Linux Foundation открыла курсы программирования под Android для начинающих. Авторы курса постарались, чтобы можно было за пару часов усвоить навыки разработки под эту платформу.
Читать дальше →

Зимняя сказка в вашем Android'e

Время на прочтение1 мин
Охват и читатели11K
«Часто по ночам пролетает Снежная королева по городским улицам и заглядывает в окошки, вот от того-то и покрываются они морозными узорами, словно цветами.»


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

Ближайшие события

Анализ и оптимизация одного запроса в EclipseLink

Время на прочтение3 мин
Охват и читатели7.2K
В этой статье я решил собрать несколько полезных практик, которым я научился за два года работы с ORM фреймворком EclipseLink на основе реального примера.
Статья расчитана на тех, кто уже работал с фрэймворком основанным на JPA, будь то Hibernate или OpenJPA.

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

Многопоточность в Java

Время на прочтение14 мин
Охват и читатели1.1M
Здравствуйте! В этой статье я вкратце расскажу вам о процессах, потоках, и об основах многопоточного программирования на языке Java.
Наиболее очевидная область применения многопоточности – это программирование интерфейсов. Многопоточность незаменима тогда, когда необходимо, чтобы графический интерфейс продолжал отзываться на действия пользователя во время выполнения некоторой обработки информации. Например, поток, отвечающий за интерфейс, может ждать завершения другого потока, загружающего файл из интернета, и в это время выводить некоторую анимацию или обновлять прогресс-бар. Кроме того он может остановить поток загружающий файл, если была нажата кнопка «отмена».

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

Давайте начнем. Сначала о процессах.
Читать дальше →

Рождественское приложение на Android

Время на прочтение1 мин
Охват и читатели18K
Новый Год 2013 приближается семимильными шагами, и все чаще хочется чего-то снежного, новогоднего на своем мобильном устройстве. Надеюсь, что мое приложение удовлетворит эти потребности :)

Скриншоты:
Читать дальше →

Мюнхгаузен-стайл, или один ненормальный способ запускать Java-программы на Android

Время на прочтение2 мин
Охват и читатели25K
image

В один прекрасный день меня одолело странное желание — пользоваться всей мощью моего андроид-смартфона в консоли. Очень удобный способ для всяческих утилитарных задач. В консоли — это ключевой момент моего повествования.
Как таковая разработка под Android (если мы говорим про стандартный Android SDK, а не NDK) не подразумевает консольного программирования. Активити, сервисы, интенты — в общем, на эту тему написан не один десяток статей, а моя — о другом.
Краткое пособие по вытягиванию себя за волосы

Погодник на java для начинающих и постарше

Время на прочтение10 мин
Охват и читатели22K
image

Приветствую всех в этот прекрасный день ожидания праздника, это моя первая статья на хабре, в которой я хотел бы рассказа про открытый API погоды Яндекса. Статья является продолжением серии Java для начинающих. Следует отметить, статья рассчитана на тех, кто недавно начал изучения язык или на тех, кто не знаком с данным сервисом, но в любом случае, рад я буду любым читателям (эх тавтология… ). Яндекс дает неплохую возможность для разработчиков, которым требуется в своей программе или на своем сайте разместить погоду, причем информации, которую Яндекс предоставляет более, чем достаточно.

Погоду Вы сможете выбрать за любой день на неделю вперед. Различные состояния (ясно, пасмурно и т. д.), множество языков (для городов, например русский и английский, для состояний все языки стран СНГ и не только: ясно, аяз, açık, ашық и т… д.), я не очень хорош в географии, но, кажется, информация там для всех стран, даже есть миниатюрные картинки состояния погоды, но самое главное, почему я выбрал этот сервис — простая и понятная структура. Сразу оговорюсь, за «рекламу» мне не платили.
Читать дальше

Java собеседование. Коллекции vs null

Время на прочтение3 мин
Охват и читатели135K
Всем привет!

В топике Java собеседование. Коллекции подробно изложен вопрос работы с Set & Map в Java. Но у меня ещё есть парочка любимых вопросов из этой области:

  1. Может ли null использоваться в качестве ключа в Map?
  2. Может ли Set содержать null?

подсказка (HashMap.java)
   public V get(Object key) {  
        if (key == null)  
            return getForNullKey();  
        int hash = hash(key.hashCode());  
        for (Entry<K,V> e = table[indexFor(hash, table.length)];  
             e != null;  
             e = e.next) {  
            Object k;  
            if (e.hash == hash && ((k = e.key) == key || key.equals(k)))  
                return e.value;  
        }  
        return null;  
    }  
    /** 
     * Offloaded version of get() to look up null keys.  Null keys map 
     * to index 0.  This null case is split out into separate methods 
     * for the sake of performance in the two most commonly used 
     * operations (get and put), but incorporated with conditionals in 
     * others. 
     */  
    private V getForNullKey() {  
        for (Entry<K,V> e = table[0]; e != null; e = e.next) {  
            if (e.key == null)  
                return e.value;  
        }  
        return null;  
    }  


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

Использование фильтров из Box2D в Libgdx

Время на прочтение3 мин
Охват и читатели11K
В прошлой статье рассматривалась работа с ContactListener. Вот только примеры, которые я использовал, были не совсем верно выбраны. В Box2D есть намного более удобные средства для фильтрации столкновений, а именно – фильтры. О них и напишу в этот раз.
Использование фильтров из Box2D в Libgdx
Читать дальше →