Se você utilizar evictores de plug-in, eles não ficarão ativos até você criá-los e associá-los a um mapa de apoio. As boas práticas a seguir aumentarão o desempenho para least frequently used (LFU) e menos utilizado recentemente used (LRU).
O conceito de um evictor LFU é remover entradas do mapa que não são utilizadas frequentemente. As entradas do mapa são distribuídas em uma quantidade de heaps binários configurados. Conforme aumenta o uso de uma determinada entrada de cache, ela ocupa uma posição mais alta no heap. Quando o evictor tenta um conjunto de evicções, ele remove apenas as entradas de cache que estão localizadas abaixo de um ponto específico no heap binário. Por isso, as entradas Least Frequently Used são liberadas.
O Evictor LRU segue os mesmos conceitos do Evictor LFU com algumas diferenças. A principal diferença é que o LRU utiliza uma fila PEPS (Primeiro a Entrar, Primeiro a Sair) em vez de um conjunto de heaps binários. Sempre que uma entrada de cache é acessada, ela é movida para o início da fila. Consequentemente, a frente da fila contém as entradas de mapa recentemente mais usadas e, seu final, as entradas de mapa recentemente menos usadas. Por exemplo, a entrada de cache A é utilizada 50 vezes e a entrada de cache B é utilizada apenas uma vez após a entrada de cache A. Neste caso, a entrada de cache B está no início da fila, porque foi utilizada mais recentemente e a entrada de cache A está no final da fila. O evictor LRU libera as entradas de cache que estão no final da fila, que são as entradas do mapa Least Recently Used.
Ao utilizar o evictor LFU, todas as entradas de cache para um determinado mapa são ordenadas sobre o número de heaps especificado, aprimorando o desempenho significativamente e impedindo que todas as evicções sejam sincronizadas em um heap binário que contenha todas as ordenações para o mapa. Uma maior quantidade de heaps também acelera o tempo requerido para reordenação dos heaps, porque cada heap tem menos entradas. Configure o número de heaps como 10% do número de entradas em seu BaseMap.
Ao utilizar o evictor LFU, todas as entradas de cache para um determinado mapa são ordenadas sobre o número de filas LRU especificado, aprimorando o desempenho significativamente e impedindo que todas as evicções sejam sincronizadas em uma fila que contenha todas as ordenações para o mapa. Configure o número de filas como 10% do número de entradas em seu BaseMap.
Quando um evictor LFU ou LRU começa a liberar entradas, ele utiliza a propriedade do evictor MaxSize para determinar quantos heaps binários ou elementos de fila LRU serão liberados. Por exemplo, suponha que você tenha configurado o número de heaps ou filas para ter aproximadamente 10 entradas do mapa em cada fila do mapa. Se sua propriedade MaxSize estiver configurada como 7, o evictor liberará 3 entradas de cada heap ou objeto de fila para retornar o tamanho de cada heap ou fila para abaixo de 7. O evictor libera apenas entradas do mapa de um heap ou fila quando esse heap ou fila tiver mais do que o valor da propriedade MaxSize de elementos contidos nele. Configure MaxSize como 70% do tamanho de heap ou de fila. Para este exemplo, o valor é configurado como 7. É possível obter um tamanho aproximado de cada heap ou fila, dividindo o número de entradas BaseMap pelo número de heaps ou filas utilizadas.
Um evictor não remove constantemente entradas de seu mapa. Ao invés disso, ele está inativo para uma quantidade de tempo configurada, verificando o mapa apenas a cada n segundos, em que n faz referência à propriedade SleepTime. Esta propriedade também afeta de forma positiva o desempenho: a execução muito frequente de uma limpeza por evicção reduz o desempenho devido aos recursos necessários para esse processamento. Porém, não usar o evictor frequentemente pode resultar em um mapa que tem três entradas que não são necessárias. Um mapa completo de entradas desnecessárias pode afetar negativamente os requisitos de memória e os recursos de processamento requeridos para seu mapa. A configuração de limpezas por despejo como quinze segundos é uma boa prática para a maioria dos mapas. Se houver gravações frequentes no mapa e ele for utilizado em uma alta taxa de transações, considere a configuração do valor com um tempo inferior. No entanto, se o mapa for acessado com pouca frequência, será possível configurar o tempo com um valor superior.
O exemplo a seguir define um mapa, cria um novo evictor LFU, configura as propriedades do evictor e configura o mapa para utilizar o evictor:
//Utilizar ObjectGridManager para criar/obter o ObjectGrid. Refer to
// a seção do ObjectGridManger
ObjectGrid objGrid = ObjectGridManager.create............
BackingMap bMap = objGrid.defineMap("SomeMap");
//Configurar propriedades assumindo 50.000 entradas do mapa
LFUEvictor someEvictor = new LFUEvictor();
someEvictor.setNumberOfHeaps(5000);
someEvictor.setMaxSize(7);
someEvictor.setSleepTime(15);
bMap.setEvictor(someEvictor);
A utilização do evictor LRU é muito semelhante à utilização de um evictor LFU. Este é um exemplo:
ObjectGrid objGrid = new ObjectGrid;
BackingMap bMap = objGrid.defineMap("SomeMap");
//Configurar propriedades assumindo 50.000 entradas do mapa
LRUEvictor someEvictor = new LRUEvictor();
someEvictor.setNumberOfLRUQueues(5000);
someEvictor.setMaxSize(7);
someEvictor.setSleepTime(15);
bMap.setEvictor(someEvictor);
Notice that only two lines are different from the LFUEvictor example.