Как стать автором
Обновить

Комментарии 57

Правильные ответы 23derevo выложит не все.
Поскольку и задачка по Груви от меня и задачка по Спрингу от Борисова являются неотъемлемой частью наших докладов, за правильными ответами на них придется посетить наши доклады.
Т.е на них ответы сюда не писать лучше? А то некрасиво получится)
Пишите все, но под спойлер!
Барух что то слишком простую задачку приложил) jbaruch, самые крутые на JPoint оставил?
Ты тут не умничай!
НЛО прилетело и опубликовало эту надпись здесь
И не говори. Что за люди?!
Пиши под спойлер, и мы никому не скажем, что ты прав :)
Ну а чего писать ) И так же ясно что
Заголовок спойлера
только кложур заэвалуэйтится повторно :)

Даже у какого то телезрителя Алименкова задача сложнее! (
Возникает закономерный вопрос
А сколько там кложуров?
some groovy
Кложур там только в списке только в 1 месте, AST proof

А почему так, вкратце описано на относительно новом няшном груви-сайте

Ну в а сорцах, в groovy.lang.GString#writeTo можно посмотреть что будет, если там будет кложур, принимащий одну переменую
Прям ваще.
Да сразу понятно же чем троллить будешь! В этом и беда)
Ну, это тебе понятно. Ты не забывай, это идет на jpoint, не на какой нибудь g8conf.
Все, но ваши — после конфы :)
Без единого разрыва
package\u0020ru.nullpointer.jugtest;
public
class
Hello{
public
static
void
main(String
args[]){
System.out.println("Hello\u0020world");
}
}

Вторая задача от Владимира Ситникова (NetCracker)
Регулярка не учитывает /* */ в стрингах

Написать Hello world без пробелов можно с помощью
System.out.println("Hello"+(char)32+"World");
Ваш Hello world не компилируется.
Естественно имелось в виду это
package
cz;
public
class
NoSpace
{
public
static
void
main(String[]
args)
{
System.out.println("Hello"+(char)32+"World");
}
}

Регулярки - зло
package ru.nullpointer.jugtest;

import java.util.regex.Pattern;

public class CommentCleaner {

    public static void main(String args[]) {
        String source = "/***/";
        Pattern p = Pattern.compile("/\\*(?:[^*]|\\*[^/])*\\*/");

        String result = p.matcher(source).replaceAll("");
        if (!result.isEmpty()) {
            throw new OHSHIException();
        }
    }

    static class OHSHIException extends RuntimeException {

        OHSHIException() {
            super("OH SHI--");
        }
    };
}


Не могу удержаться -- задача №4
Очевидно, что java переиспользует слоты переменных на стеке (в регистрах), когда можно понять, что переменная дальше по коду функции не используется. В обоих случаях аллоцированные массивы перестают быть нужными сразу после вычисления их длины для передачи в println() — поэтому, в идеале, в обоих случаях максимальное необходимое количество памяти не превышает размера одного массива. Почему в одном случае все-таки вылетает исключение?
Я могу предположить, что есть некоторое количество слотов на стеке, ниже которого нет смысла оптимизировать (тем более, что main вызывается лишь однажды, поэтому о реальной оптимизации C1/C2 речь, скорее всего, не идет — почти наверняка тут мы работаем в интерпретируемом режиме). Методом научного тыка можно обнаружить, что вот такой код
public static void main( final String[] args ) {
		{
			final byte[] bytes = new byte[SIZE];
			System.out.println( bytes.length );
		}

		final byte[] a = {}; // <=== !!!

		final byte[] bytes = new byte[SIZE];
		System.out.println( bytes.length );

		System.out.println( "I allocated memory successfully" );
	}

выполняется без ошибок. В то время, как вот такой
public static void main( final String[] args ) {
		final byte[] a = {};
		{
			final byte[] bytes = new byte[SIZE];
			System.out.println( bytes.length );
		}



		final byte[] bytes = new byte[SIZE];
		System.out.println( bytes.length );

		System.out.println( "I allocated memory successfully" );
	}

Падает с OOM.

Отсюда можно предположить, что на моей версии джавы (1.6.0_45), во видимому, два последних (то есть последних используемых) слота на стеке java не трогает, но если их становится больше, то делаются какие-то попытки переиспользовать предыдущие.

P.S. Любопытно, что вот такой код
public static void main( final String[] args ) {
		{
			final byte[] bytes = new byte[SIZE];
			System.out.println( bytes.length );
		}                       
		int a = 0;   // <== constant

		final byte[] bytes = new byte[SIZE];
		System.out.println( bytes.length );

		System.out.println( "I allocated memory successfully" );
	}

Падает с OOM, но если заменить a= 0; на a=args.length — то выполняется успешно. Опять же, можно предположить, что константная переменная просто заменяется на свое значение, без реального размещения ее на стеке, а переменная с хоть сколь либо динамическим значением все-таки размещается — и вытесняет со стека размещенный там byte[]
грязный, грязный извращенец!
Ну интересно же было разобраться! А потом уж что, сидеть на этом знании как Кащей над злате? ;)
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
а мы с Лёшей сейчас это обсудим!
Конечно, реклама для лохов, но Лёшу зачем с «будущим Java» вместе поставили? Придётся, видимо, Лёшей пожертвовать в угоду будущему.
когда программа хорошая (а она хорошая!), все время кто-то интересный тебе идет параллельно с кем-то другим, тоже интересным.

Скажи лучше, есть ли слоты, в которые тебе не на что пойти?
На 13:50-14:40 я бы всем пожертвовал. Можно про профилирование послушать, но опционально. Скорее всего пойду в экспертную зону №1, может, там полезнее будет.

На 12:50-13:40 в принципе можно бы было всё пропустить, если б было что-то из вечерних докладов в параллели (Куксенко или Чуйко, например: оба интересны и тоже одновременно идут). Катехизис прекрасен, я не спорю, но я смотрел его на ютюбе и Алексей пишет, что будет почти то же самое. А «Сжимай меня полностью», как я понимаю, новый доклад (поправьте, если ошибаюсь), его жалко. Возможно, Фолькера послушаю. Ну или уж Алексея уважу, если места хватит :-)

И да, на 10:30-11:20 я бы тоже пропустил, если б в параллель шёл почти любой из остальных докладов :-)
ты как-то очень сложно все расписал: "… я бы пропустил, если б… ". Я в итоге ничего не понял :)
легче написать на что ты хочешь пойти. Потому что по комментарию похоже, что ты готов не пойти никуда.
Ага, а деньги я печатаю, и мне ничего не стоит прилететь из Новосиба в Москву и оплатить участие ради того, чтобы пойти никуда =)

Если интересно, то вот куда я хочу в порядке убывания приоритета:

  • Круглый стол. Будущее Java-платформы
  • Сжимай меня полностью
  • CompletableFuture уже здесь
  • Тайны — в наших головах, а не в JVM
  • Где моя память, чувак?!
  • Круглый стол. HighLoad
  • Железные счётчики на страже производительности

Если бы эти семь не пересекались, я был бы счастлив. Дальше так:

  • Лучший отладчик — сделанный своими руками
  • Катехизис java.lang.String
  • Packed Objects, Object Layout & Value Types — a Survey
  • Непрерывное профилирование Java-приложений в ходе эксплуатации
  • Выражаемся регулярно
  • Круглый стол. Рефакторинги и технический долг
  • Круглый стол. Рабочие инструменты Java-разработчика

Твои доклады в топ-14 не попали, извиняй =)
всё ок, мне достаточно того, что они у меня получаются лучшими докладами всех jpoint и joker конференций. Но не для всех, да :-)
вон, 23derevo их тоже не любит :-)
я их обожаю!
Ну да, я сначала тоже с циклами начал экспериментировать. Но там слишком много вариантов получается — и чтобы их грокнуть, чтобы построить какую-то вменяемую модель, нужно было лезть в дизасм или исходники JVM. А мне лень — я хотел простое объяснение для конкретного примера. Потому что общая идея что ссылка живет не до завершения метода, а насколько JVM мозгов хватит — она давно известна, как раз из дискуссий по ранней финализации, на которую Алексей ссылается. И вопрос был лишь в том, чем два отличаются от трех. И — неожиданно — оказалось, что два отличаются от трех ровно на один.
НЛО прилетело и опубликовало эту надпись здесь
присоединяюсь к вопросу
Увы, но нет. Зато придут люди из моей команды
Пичалька.
НЛО прилетело и опубликовало эту надпись здесь
пиняшка!
Кто именно и с каким докладом?
Послушать, Володя, просто послушать )
Задача №2
Регулярка не учитывает контекст — например, применив ее сюда
String stringLiteral = " /* this is not a comment but a string literal */ ";

будем немного расстроены результатом.

P.S. Вместо пробела можно использовать unicode escape типа \uXXXX, например.
ASPECTJ адок
Скомпилируется то нормально, только при вызове count очевидно получим StackOverflow, дергаем же метод снова прямо из аспекта.
У Вас по Java только 1 задача, остальные имеют к языку лишь опосредованное отношение.
К языку да, к платформе — нет.

Но вообще сейчас разбавим, ага!
Предпоследняя задача
В java не скомпилится.
image
данунеможетбыть!
мояджавасъелаейнорм
Третья о спринге
Если не хочется проставлять
context.setAllowBeanDefinitionOverriding(false);

Всегда можно написать свой BeanPostProcessor, который будет разруливать такие ситуации
Задача №4
Обе программы выдадут и выдают OOM в JDK 1.8.0.25 32-bit. Получается условие задачи заведомо неверное, так как автор считает, что одна из программ не выбросит OOM, хотя на практике обе бросают.
окей, тогда почему обе бросают?
Давайте считать, что для 32-битной JVM предполагается запускать её с опцией -server.

>"C:\Program Files (x86)\Java\jdk1.8.0_31\bin\java.exe" -server OOM1
358862028
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
        at OOM1.main(OOM1.java:9)

>"C:\Program Files (x86)\Java\jdk1.8.0_31\bin\java.exe" -server OOM2
228366745
228366745
228366745
I allocated memory successfully
Последняя – от Евгения Борисова
Первый вариант — заимплементить SmartLifecycle.stop(Runnable) и назначить обоим одинаковые фазы.
Второй — использовать ApplicationEventMulticaster (например, SimpleApplicationEventMulticaster) с соответствующим taskExecutor (например, ThreadPoolExecutor) и повесить обоих на ContextCloseEvent.
В теории оба варианта должны сработать)
Ты крут!
Зарегистрируйтесь на Хабре, чтобы оставить комментарий