I am currently using memcached with my java app, and overall it\'s working great.
The features of memcached that are most important to me are:
What about Terracotta?
memcached can be substituted by Couchbase - this is an open source and commercial continuation of this product line. It has data to disk persistence (very efficient and configurable). Also original authors of memcached have been working on Couchbase and its compatible with memcached protocol - so you don't need to change your client application code! Its very performing product and comes with 24/7 clustering and Cross Datacenter Replication (XDCR) built in. See technical paper.
You could use Tarantool (http://tarantool.org). It is an in-memory database with persistence, master-master replication and scriptable key expiration rules - https://github.com/tarantool/expirationd
I think membase is what you want.
Have you looked at BerkeleyDB?
However, it fails to meet one of your criteria:
We are using OSCache. I think it meets almost all your needs except periodically saving cache to the disk, but you should be able to create 2 cache managers (one memory based and one hdd based) and periodically run java cronjob that goes through all in-memory cache key/value pairs and puts them into hdd cache. What's nice about OSCache is that it is very easy to use.