It was too late last night, so I did not dig into the problem. Not sure whether I am right. Following is what I observed:

In two column mode, firstly, part of page 2 is cached, which roughly took more then half of the whole cache. Then when the user request the other part, and it turns out that the cached part does not contain the requested area. So unireader render the new part and put it into cache and increases the current cache size.

Here is how things went wrong, since these two parts are in the same page, their related cache item have the same hash value. So when the second cache item is put into the cache pool, it overwrite the first one using the same hash key. Then we end up with a cache pool with only one cache item but the current cache size is the sum of first and second cache item. This caused a endless loop in the cacheClaim function's while loop.

So in sum, the not used part is actually overwritten instead of being evicted.