Associative caches attempt to reduce the number of collision misses by allowing blocks of data that would have used the same cache line to simultaneously be in the cache. More specifically, instead of mapping a block of data to a cache line, a block is mapped to a set of cache lines and may be placed in any of them. When data is accessed, each of this set of cache lines must be examined to see if the desired block is present. If the desired block is not in the cache, one of this set must be chosen to be replaced.
A fully associative cache uses the entire cache for every block (the cache is the one set) so there are no collision misses. Unfortunately, a fully associative cache is slower since each cache line must be examined every time. In practice, a set associative cache is used, where there are only 2, 4 or 8 cache lines in each set. A set associative cache can be accessed with minimal slowdown while having a significant effect on the miss rate. Empirical studies have shown that using set associative caches with larger sets usually do not give a significant improvement in the miss rate.