La cache di Java Integer è una realizzazione del modello del pool di oggetti?

3

Uno degli esempi più noti di un pool di oggetti completo è il pool di connessioni JDBC. Motivi principali:

    Gli oggetti
  • nel pool sono costosi da creare e relazionarsi con risorse esterne
  • ogni oggetto nel pool viene offerto al massimo un client ogni volta
  • Gli oggetti
  • nel pool devono essere riportati allo stato pulito prima di essere nuovamente pubblicati su un nuovo client

Considerando quanto sopra, la cache di Java Integer può essere considerata come realizzazione di un pool di oggetti? Ecco perché ne dubito:

    Gli oggetti
  • nel pool possono essere utilizzati da più di un client alla volta a causa della loro immutabilità
  • l'immutabilità impedisce anche agli oggetti del pool di raggiungere uno stato di esaurimento
  • non esiste la nozione di un oggetto "libero", pronto per essere assegnato a un cliente
posta Andrei Nicusan 22.06.2014 - 23:32
fonte

2 risposte

6

È veramente il modello peso vivo che è un tipo specializzato di pool di oggetti, dove gli oggetti vengono condivisi per risparmiare memoria.

    
risposta data 23.06.2014 - 00:58
fonte
-2

Il problema con una cache Integer Java è che la VM è ottimizzata per il boxing / unboxing. Il meccanismo di ricerca per un Integer Java "memorizzato nella cache" sarà più costoso della semplice creazione dell'oggetto.

building cache
test length 500,000,000
cached duration: 12001.345937
boxed duration: 12108.983383

In molti scenari, la ricerca di molti thread causa molti errori di cache su diversi core e ha un impatto maggiore sulle prestazioni.

System.out.println("building cache");

Integer[] cache = new Integer[50000];

for( int i = 0; i < cache.length; i ++)
{
    cache[i] = new Integer(i);
}

int c = 500 * 1000000;
int t = 0;

System.out.println("test length " + c );

NanoStopWatch watch = new NanoStopWatch();

watch.start();

while( t < c)
{
    Integer p = cache[ (int)  (Math.random() * 5000) ];

    t++;
}

watch.stop();

System.out.println("cached duration: " + watch.duration() );

t = 0;

watch.start();

while( t < c)
{
    Integer p =  (Integer) (int) (Math.random() * 5000);

    t++;
}

watch.stop();

System.out.println("boxed duration: " + watch.duration() );
    
risposta data 23.06.2014 - 05:10
fonte

Leggi altre domande sui tag