O melhor ponto de partida são os logs. Como você diz que o log do aplicativo não mostrou nada útil, você deve examinar os logs do sistema como dmesg e cron jobs. Uma entrada comum no dmesg seria um erro OOM (falta de memória), mas você disse que havia bastante memória livre. Para obter o tempo de uma falha, minha maneira preferida é executar
date; time command
onde comando é o programa a ser executado. Adicionando o tempo de saída pelo tempo após o programa ter caído para o tempo de saída por data ao iniciar, você obtém o tempo que ele caiu. Execute isso várias vezes e procure padrões como o mesmo tempo de execução ou tempo de falha. Veja também os cronjobs diários que não são iniciados todos os dias à mesma hora.
Outros motivos podem ser um bug no programa ou no programa usando ponteiro de 32 bits e não alocar mais memória.