J'ai un problème avec mon programme Java qui se ferme soudainement, sans aucune exception levée ou le programme se terminant normalement. J'écris un programme pour résoudre Project Euler14th problem. Voilà ce que je suis:Java VM se déconnectant soudainement sans raison apparente
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;
}
Cela fonctionne très bien, et se termine correctement en 5 secondes avec un objectif de 1 000 000.
Je voulais optimiser en ajoutant un cache, donc je changé la méthode de taille à ceci:
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;
}
maintenant, quand je le lance, il arrête simplement (sorties de processus) quand je reçois à 555144. même nombre chaque fois. Aucune exception, erreur, plantage Java VM ou tout est levé.
Modification de la taille du cache ne semble pas avoir d'effet non plus, alors comment le cache introduction peut provoquer cette erreur?
Si j'appliquer la taille du cache pour être non seulement initial, mais permanent comme ceci:
if (i < CACHE_SIZE) {
cache.put(i, size);
}
le bug ne se produit plus. Modifier: Lorsque je définis la taille du cache sur 2M, le bogue commence à s'afficher à nouveau.
Quelqu'un peut-il reproduire cela, et peut-être même donner une suggestion pour expliquer pourquoi cela se produit?
Sur quel système d'exploitation travaillez-vous? –
Je cours sous Windows Vista Professionnel et JDK 1.6.0_03 – Jorn
Vous pouvez essayer de mettre à jour le JDK et voir si vous obtenez le même comportement. Ils sont maintenant sur la mise à jour 16 à 1.6. – digitaljoel