Recolección de basura en Java

Exposición:

En general, el recuento de referencias tiene la debilidad de "no puede detectar bucles". Sin embargo, en algunos casos, el conteo de referencias es realmente útil:

class EmergencyPatient {
  DoctorPtr doctor;
  EmergencyPatient() { doctor = Doctor::acquire(); }
  ~EmergencyPatient() { Doctor::release(doctor); } 
};

Ahora, en un mundo de referencia contada, tan pronto como ya no nos referimos a un paciente de emergencia, se libera al médico.

En el mundo no contabilizado de Java, esto depende en gran medida de cuándo se recolecta basura el EmergencyPatient, y dado que el recolector de basura es generacional, el EmergencyPatient puede estar en una generación anterior y no recolectarse durante mucho tiempo.

Problema:

Para mí, un médico es un recurso muy valioso; Otros pacientes de emergencia necesitan médicos. Sin embargo, para Java, el objeto EmergencyPatient es solo unos pocos bytes de memoria.

Pregunta:

¿Cuál es la forma correcta de resolver este problema? (Hay algunos recursos que quiero liberar cuando sepa que ya no se usan).

¡Gracias!

Respuesta 1

Si examina los 4 objetos de referencia, hay uno que le notificará cuando su objeto se convierta en "Elegible para recolección de basura". Esto significa que no tiene que esperar un GC "grande", puede informarle durante uno de los pases menores si su objeto se ha vuelto inalcanzable, incluso si está en una de las áreas de generación más antiguas.

Creo que se supone que esta es la forma correcta de hacer lo que estás intentando.

Respuesta: 2

Estás combinando recursos de asignación (como en Médicos) con memoria de asignación. Si la memoria es su recurso valioso, entonces tiene razón, Java no le brinda el control de grano fino que podrían tener otros lenguajes. El beneficio que obtienes a cambio de no tener ese control de grano fino es que te liberas de la memoria de microgestión, algo que puede aumentar la productividad y la estabilidad.

Si está administrando un recurso que no sea memoria, por ejemplo, médicos en este caso, puede usar otros patrones para asegurarse de que se liberen cuando el objeto que los usa ya no los requiera. Una forma de hacerlo sería hacer que el paciente bloquee al médico mientras recibe tratamiento y luego suelte el bloqueo una vez tratado.

Respuesta: 3

Hay una función JDK que, aunque javadocs no lo declara seguro para subprocesos, al mirar el código en Google, parece que podría obtener el resultado que quiero al llamarlo desde múltiples ...

He visto el Fowler-Noll-Vo (FNV) recomendado como una buena opción para un algoritmo de hashing rápido para usar en nuestra implementación de un sistema de hashing consistente. Parece que no se puede encontrar una buena fuente de Java para ...

¿Alguien podría decirme cómo puedo anular el método HashSet's contiene () para usar una coincidencia de expresiones regulares en lugar de solo igual ()? O, si no se anula, ¿cómo puedo agregar un método para usar un patrón regex? Básicamente, yo ...

Estoy construyendo un sistema en Java / Groovy que involucra la invocación dinámica de servicios web. Utilizo JAX-WS para invocar un servicio con una interfaz WSDL 1.1, pero no pude encontrar ninguna información útil sobre ...