Dynamic Purity Analysis For Java Programs