У меня проблема с внезапным завершением работы моей Java-программы, без каких-либо исключений, или когда программа нормально завершает работу.
Я пишу программу для решения Project Euler 14-й проблемы . Вот что я получил:
private static final int INITIAL_CACHE_SIZE = 30000;
private static Map<Long, Integer> cache = new HashMap<Long, Integer>(INITIAL_CACHE_SIZE);
public void main(String... args) {
long number = 0;
int maxSize = 0;
for (long i = 1; i <= TARGET; i++) {
int size = size(i);
if (size > maxSize) {
maxSize = size;
number = i;
}
}
}
private static int size(long i) {
if (i == 1L) {
return 1;
}
final int size = size(process(i)) + 1;
return size;
}
private static long process(long n) {
return n % 2 == 0 ? n/2 : 3*n + 1;
}
Это работает нормально и завершается правильно примерно через 5 секунд при использовании ЦЕЛИ 1 000 000.
Я хотел оптимизировать, добавив кеш, поэтому я изменил метод размера следующим образом:
private static int size(long i) {
if (i == 1L) {
return 1;
}
if (cache.containsKey(i)) {
return cache.get(i);
}
final int size = size(process(i)) + 1;
cache.put(i, size);
return size;
}
Теперь, когда я запускаю его, он просто останавливается (процесс завершается), когда я добираюсь до 555144. Каждый раз одно и то же число. Не исключение, ошибка, сбой Java VM или что-либо другое.
Изменение размера кеша, похоже, тоже не имеет никакого эффекта, так как кеш может
Введение причиной этой ошибки?
Если я сделаю так, чтобы размер кэша был не просто начальным, а постоянным, вот так:
if (i < CACHE_SIZE) {
cache.put(i, size);
}
ошибка больше не возникает.
Редактировать: Когда я устанавливаю размер кэша равным 2М, ошибка снова начинает отображаться.
Может кто-нибудь воспроизвести это, и, возможно, даже предложить, почему это происходит?