2011-02-07 10 views
25

¿Qué es la agrupación de objetos y qué es una referencia de objeto débil?¿Qué es la agrupación de objetos en Java?

¿Cómo podemos implementarlos usando Java?

+1

(Tenga en cuenta que si tiene la intención de implementar un caché, evite 'WeakReference'. Puede borrar * mucho * más rápido que en sus pruebas). –

Respuesta

12

Comprobar commons-pool

proporciona una API agrupación de objetos-

Se utiliza generalmente para los objetos cuya creación es caro. Para evitar que mantenga un grupo de N objetos creados previamente y reutilizarlos.

32

Un grupo de objetos es una colección de un objeto particular que una aplicación creará y tendrá a mano para aquellas situaciones en las que la creación de cada instancia sea costosa. Un buen ejemplo sería una conexión de base de datos o un hilo de trabajo. El grupo verifica las entradas y salidas de usuarios como libros de una biblioteca.

Normalmente, la agrupación de objetos se maneja mediante un servidor de aplicaciones Java EE. Si necesita hacerlo usted mismo, mejor utilizar algo como el conjunto de objetos de Apache. No escribas uno tú mismo; la seguridad del hilo y otros problemas pueden complicarlo.

Here's una buena referencia en referencias de objetos débiles.

+1

Solo un pequeño comentario: no es tan difícil escribir un grupo. Solo aplica el [patrón flyweight] (https: //en.wikipedia.org/wiki/Flyweight_pattern) y asegúrese de sincronizar el acceso al grupo. Mira el ejemplo: es una buena estrategia sincronizar _después_ que marcaste una clave y no existía, y luego verificar la existencia de esa clave nuevamente _cuando sincronizada_ (ya que otra secuencia podría haberlo puesto en el grupo en ese momento) . Esto reduce la sobrecarga de la sincronización. –

+1

Nadie dijo que era difícil escribir un grupo. Mucha gente ya lo ha hecho. No tiene sentido volver a hacerlo a menos que quieras aprender a hacerlo. Señalaré que esta respuesta tiene 4.5 años. Puede ayudar a su representante aquí mucho más al responder nuevas preguntas. Tengo curiosidad por saber por qué seleccionó mi respuesta para hacer comentarios cuando todos los demás están en la misma línea. – duffymo

4

Un grupo de objetos es cualquier colección de objetos que se reciclan, en lugar de volver a crear cada vez que se necesitan.

Existen varias maneras de implementar un conjunto de objetos según sus requisitos. Los pools de objetos se utilizan para ayudar al rendimiento incluso para objetos simples, pero no son tan útiles en Java 5+.

Sugiero que solo los use para objetos que se conectan a recursos externos como archivos, sockets o conexiones de bases de datos.

+1

"no es tan útil en Java 5+." ¿por qué? –

+0

En Java 5.0, la creación y recopilación de objetos era mucho más eficiente, lo que hacía que los conjuntos de objetos fueran más caros que útiles en muchos casos para grupos de objetos simples. Para piscinas de objetos ultraligeros, pueden ser útiles para el rendimiento y la reducción de GC. –

1

Pooling Pooling & objeto:

Pooling básicamente significa utilizar los recursos de manera eficiente, al limitar el acceso de los objetos que sólo el período que el cliente lo requiere.

El aumento de la utilización a través de la agrupación generalmente aumenta el rendimiento del sistema.
La agrupación de objetos es una forma de administrar el acceso a un conjunto finito de objetos entre los clientes de la competencia.
En otras palabras, la agrupación de objetos no es más que el intercambio de objetos entre diferentes clientes.

Dado que la agrupación de objetos permite compartir objetos, los otros clientes/procesos necesitan volver a crear instancias del objeto (lo que disminuye el tiempo de carga), en su lugar pueden usar un objeto existente.
Después del uso, los objetos se devuelven al grupo.


Débil objeto de referencia:

Una referencia débil es un soporte para una referencia a un objeto llamado el referente.
Con referencias débiles, puede mantener una referencia al referente sin evitar que se recolecte basura.
Cuando el recolector de elementos no utilizados rastrea el montón si las únicas referencias pendientes a un objeto son referencias débiles, entonces el referente se convierte en un candidato para GC como si no hubiera referencias pendientes y se borran todas las referencias débiles pendientes.

Recuerde, GC siempre, utilizando algunos algoritmos, recupera los objetos débilmente alcanzables.

5

Una referencia débil es un tipo de variable de referencia que es tratada especialmente por el recolector de basura.

Esto introduce otro tipo de accesibilidad, cualquier objeto puede ser:

  • fuertemente accesible (accesible desde cualquier hilo de vida solo referencias normales)
  • débilmente accesible (no fuerte alcanzable, pero accesible por una referencia débil (o de múltiples maneras, que incluyen cada uno una referencia débil))
  • no alcanzables en absoluto

(También hay Referencias suaves y Phantom Referencias, que dejo aquí -. Que funcionan de manera similar e introducir más niveles intermedios)

Si un objeto no es accesible a todos, puede ser recolección de basura en cualquier momento. Si un objeto es muy accesible, no se puede recoger basura en absoluto. Si el recolector de elementos no utilizados encuentra que un objeto (o un grupo de objetos) es débilmente accesible (quizás por varias referencias débiles), borra todas estas referencias a la vez, y luego los objetos no son alcanzables (y pueden ser basura recogido).

(En realidad no es/puede ser un paso finalización entre el "no alcanzable" y la colección, que también puede hacer que el objeto de nuevo accesible.)

Para poder utilizar referencias débiles, puede utilizar la clase java.lang.ref.WeakReference - la referencia real está en una variable privada de esta clase, y solo se puede establecer con el constructor, y luego se borrará. Puede subclasificar esta clase, si necesita otros datos además de la referencia en sí, que aún deberían estar allí cuando se borre la referencia.

Para un conjunto de objetos en el sentido de "evitar la instanciación costosa", una referencia débil no es la herramienta correcta.

0

Implementé un simple ObjectPool en Java, consulte aquí Sin embargo, no utiliza referencias de objetos débiles. Objetivo de la referencia de objeto débil para permitir la recopilación de una memoria de objeto incluso si hay referencias al objeto, pero son débiles. Es más útil para cachés que para grupos de objetos, aunque también se puede usar para ellos.

2

La idea de patrón de grupo de objetos es similar a la de la biblioteca. Todos sabemos que es más barato y fácil ir a una biblioteca y pedir prestado un libro en lugar de comprarlo. Del mismo modo, es más barato (en cuanto a memoria y velocidad del sistema) que un proceso tome prestado un objeto en lugar de crear una instancia. Entonces, tal proceso en el que un proceso toma prestado un objeto de otro proceso se denomina agrupación de objetos.

Cuestiones relacionadas