例外がスローされたり、プログラムが正常に終了することなく、Javaプロガムが突然終了する問題があります。明白な理由なしにJava VMが突然終了する
私はProject Eulerの14th problemを解決するプログラムを書いています。これは私が得たものである:私はキャッシュを追加することによって、最適化したかったので、私は変更
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;
}
これは正常に動作し、1 000 000
のTARGETを使用した場合、約5秒で正常終了しますこれにサイズ方法:私はそれを実行したとき、私は555144.同じ番号にするたびに取得するときに
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;
}
は今、それは単に(プロセスが終了)を停止します。例外、エラー、Java VMクラッシュなど何もスローされません。
キャッシュサイズを変更しても効果がないようですが、キャッシュ でこのエラーがどのように発生するのですか?
私は初期のが、そうのような永続的なだけではないようにキャッシュサイズを強制した場合:
if (i < CACHE_SIZE) {
cache.put(i, size);
}
バグが発生しなくなりました。 編集:2Mのようにキャッシュサイズを設定すると、バグが再び表示され始めます。
誰でもこれを再現できますか、それが起こる理由についての提案を提供することもできますか?
あなたはどのOSで実行していますか? –
私はWindows Vista BusinessとJDK 1.6.0_03を実行しています – Jorn
jdkを更新して、同じ動作をするかどうかを確認してください。彼らは今更新16から1.6になっています。 – digitaljoel