1. A method comprising: determining, for a plurality of cache blocks in a cache memory, an estimated utility and lifetime of the contents of each cache block, the utility of a cache block to indicate a likelihood of use its contents, the lifetime of a cache block to indicate a duration of use of its contents; receiving a cache access request resulting in a cache miss; and selecting one of the cache blocks to be replaced based, at least in part, on one of the estimated utility or estimated lifetime of the cache block.