¿Qué tan inteligente es Java JVM sobre GC'ing durante una operación reduce () en una larga lista de Scala o Stream?

Bien, déjame ver si puedo explicarte.

Tengo un código que envuelve un iterador Java (de Hadoop, como sucede) en un flujo de Scala, de modo que potencialmente pueda leerse más de una vez, por código de cliente sobre el que no tengo control directo. Lo último que se hace con este Stream es una operación reduce (). Stream recuerda todos los elementos que ya se han visto. Desafortunadamente, en algunas circunstancias, el iterador será extremadamente grande, por lo que almacenar todos los elementos en él conducirá a errores de falta de memoria. Sin embargo, en general, las situaciones en las que el código del cliente necesita la función de iteración múltiple no son las mismas con los iteradores que destruyen la memoria, y si tales casos existen, ese no es mi problema.

Lo que quiero asegurar es que puedo proporcionar la capacidad de memoria para el código que lo necesita, pero no para el código que no lo necesita (en particular, para el código que nunca mira el Stream en absoluto).

El código para reduce () en Stream dice que está escrito de una manera que permite que GC de las partes ya visitadas de Stream sucedan mientrasreductora Entonces, si puedo asegurarme de que esto realmente suceda, estaré bien. Pero en la práctica, ¿cómo puedo asegurarme de que esto suceda? En particular, si la función A crea y pasa la secuencia a la función B, y la función B pasa la secuencia a la función C, y la función C luego llama a reducir (), entonces, ¿qué pasa con las referencias a la secuencia todavía en las funciones A, B y C ? En todos estos casos, no habrá más uso de la transmisión en ninguna de las tres funciones, aunque las llamadas no son necesariamente recursivas. ¿Es la JVM lo suficientemente inteligente como para garantizar que su recuento de referencia sea 0 de las funciones A, B y C en el momento en que se llama a reduce (), para que el GC pueda suceder? Esencialmente, esto significa que la JVM nota en la función A que lo último que hace con el elemento es llamar a la función B, por lo que elimina su propio identificador al mismo tiempo que llama a B,

Si esto funciona correctamente, ¿funciona también si A, B o C tienen una variable local que se aferra al elemento? (Lo cual, nuevamente, no se usará después). Eso es porque es bastante más difícil codificar esto correctamente sin usar variables locales.

Respuesta 1

Tengo un método java escrito usando expresiones lambda donde necesito agregar más condiciones, y se me prohibió usar if y elses clásico. Este es mi código actual que comprueba si getInstrument ...

Estoy tratando de convertir apache.spark.ml.linalg.Vector a ArrayList en Java. El código fuente es así: Vector vector = (Vector) row.get (1); ArrayList <String> vectorList = new ArrayList <...

He visto respuestas aquí que pueden usar variables de const estáticas finales en Java para evitar que se compilen secciones de código. Mi preocupación con ese enfoque es que soy olvidadizo. :-( Soy ...

Mi fecha y hora está actualmente almacenada como marca de tiempo UNIX. Quiero mostrarlo como h: mm a en mi Recyclerview. ¿Dónde debo convertir la marca de tiempo UNIX a la hora normal en el adaptador RecyclerView / ...