Javaで再現性の低い不具合に出会った時に疑う4つのパターン
1. マルチスレッドによる非同期の可変データへのアクセスを疑う
→スレッドIDを確認の後、同期処理を入れて確認
2. SetやMapやorder by句のないSQLで取得したListなどの順序がランダムになるデータを疑う
→データを巡回処理している場所で確認
3. 外部ファイル、外部データを疑う
→関連するファイルの状態をWinMergeやDiffMergeなどで確認
4. マシンやVMの状態を疑う
→VisualVMのあらゆるダンプを確認、OSのリソースを使ってるならプロセスのダンプを確認。ProcessExplorerなどのツールでIPやポート、CPUやIO、ファイアウォールやネットワーク帯域の状況も必要であれば監視。
とにかく何度も処理を繰り返せるようなモデルを作って再現させることが重要。そして、再現した瞬間に徹底的に上記のパターンで調べる。