Шесть лет назад я прожигал несколько дней, пытаясь выследить, где мой совершенно детерминированный фреймворк реагирует случайным образом. После тщательного изучения всего фреймворка, убедившись, что он использует один и тот же экземпляр Random, я продолжил погоню за пошаговым кодом. Это был очень повторяющийся итеративный код самовызова. Хуже того, проклятый эффект проявится только после того, как будет выполнено огромное количество итераций. И спустя +6 часов я, наконец, сошел с ума, когда обнаружил в javadoc строку для HashSet.iterator (), указывающую, что она не гарантирует порядок, в котором будут возвращены элементы. Затем я просмотрел всю свою базу кода и заменил все экземпляры HashSet на LinkedHashSet. И, черт возьми, моя структура возникла прямо в детерминированную жизнь! ARGH!
Я только что испытал тот же самый FREAKIN аффект, снова (по крайней мере, на этот раз это было всего 3 часа). Для любой причины, Я упустил небольшую деталь о том, что HashMap ВЕДЕТ ТАК ЖЕ для своего keySet ().
Вот такая ветка на эту тему, хотя обсуждение никогда не дает полного ответа на мой вопрос: Порядок итераций HashSet
Итак , Мне любопытно, почему это могло произойти. Учитывая оба раза, у меня было огромное однопоточное Java-приложение, которое просматривало точно такое же пространство для создания / вставки с точно такими же параметрами JVM (несколько запусков из одного и того же командного файла) на одном компьютере и почти ничего не работало, что могло бы смутить JVM такая, что HashSet и HashMap после огромного количества итераций будут вести себя непредсказуемо (а не непоследовательно, как сказано в javadoc, чтобы не зависеть от порядка)?
Любые идеи по этому поводу из исходного кода (реализация этих классов в Джава. util) или из ваших знаний о JVM (возможно, какой-то сборщик мусора влияет на то, где внутренние классы Java получают ненулевую память при выделении пространств внутренней памяти)?