¿Qué objetos son persistentes en Java Card y cuándo?

Esta pregunta es doble, pero con suerte no debería ser irrazonablemente larga de responder, a pesar de su propia extensión. Sin embargo, siéntase libre de responder solo una parte, ¡y lo siento por hacerlo tan exhaustivo!

  • ¿Qué objetos persisten? ¿Qué objetos son transitorios?
  • ¿Cuándo persiste un objeto?

Para la primera parte, la pregunta se aplica a:

  • Objetos que se almacenan en un Applet
  • Objetos que se almacenan de forma transitiva en un Applet
  • Objetos que solo se almacenan en variables de pila (sin referencia, incluso transitivamente, de ninguna Applet)
  • Objetos que se almacenan en una matriz construida con makeTransientObjectArray
  • Los objetos que se almacenan de forma transitiva en una matriz con makeTransientObjectArray(p. Ej. Se almacenan en una variable miembro de un objeto almacenado en a makeTransientObjectArray)

Para la segunda parte, se aplica dependiendo de la respuesta de la primera pregunta. Por ejemplo:

  • Supongo que los objetos que se almacenan directamente en una matriz de objetos transitorios no persisten. En este caso y suponiendo que los objetos en la pila son persistentes, ¿cuándo el objeto almacenado allí no se conserva? ¿Persiste new Objecty no persiste cuando se coloca en la matriz de objetos transitorios?
  • Si un objeto tiene referencias de una matriz de objetos transitorios y un applet, y la referencia del applet se borra, ¿el objeto no persiste?

¡Gracias de antemano!


He examinado la especificación JCRE v2.2.2 (la versión que estoy usando), pero hay puntos que no están claros (de ahí la exhaustividad de esta pregunta, ya que creo que esto es más apropiado para un estilo Q / A) foro):

  • La página 2-2 menciona que el JCRE hace que un objeto sea persistente cuando se almacena de forma transitiva en un archivo Applet. Sin embargo, el Glosario-7 establece que los objetos son persistentes por defecto. La diferencia puede parecer no observable, pero afecta la necesidad de recolectar basura o no cuando se necesita un ciclo de encendido de la tarjeta de todos modos.
  • La página 5-1 establece que los campos de un objeto transitorio nunca deben almacenarse en la memoria persistente. Pero no indica si esto también es cierto para los objetos de forma transitiva en una matriz de objetos transitorios, por ejemplo. objetos almacenados en campos de objetos en una matriz de objetos transitorios.
  • La página 5-1, las mismas declaraciones, pueden entrar en conflicto con la página 2-2, cuando un objeto tiene una referencia almacenada tanto en una matriz de objetos transitorios como en una Applet.

Estas tres preguntas son respectivamente equivalentes a:

  • parte 1 viñetas 3 y 5 (y, según la respuesta, parte 2 viñeta 1)
  • parte 1 punto 5
  • parte 2 viñeta 2
Respuesta 1

P : ¿Qué objetos persisten? ¿Qué objetos son transitorios?

Todos los campos de instancia de objeto son persistentes cuando se crean usando new. Es posible que los objetos creados por JRE no lo sean: tendría que consultar la tarjeta Java o la documentación del sistema operativo para averiguarlo. Tenga en cuenta que los campos a otros objetos son referencias . Esas referencias mismas pueden apuntar a matrices en memoria transitoria u otros objetos que contienen estado volátil.

Las matrices son transitorias si se crearon o definieron como transitorias (generalmente mediante una llamada makeTransientXxxArray()). Son persistentes cuando se crean usando new.

P : ¿ Cuándo persiste un objeto?

Tras la creación o durante cualquier actualización. En general, los valores persistentes simplemente se colocan en la memoria persistente: flash o EEPROM. Cualquier escritura en flash o EEPROM se conserva directamente. Tenga en cuenta que el mecanismo de transacción de la Java Card aún puede revertir los cambios en la memoria persistente.

Esto es muy diferente de Java SE, donde las instancias de objetos se almacenan en la RAM y, por lo tanto, deben conservarse después de la creación y cada actualización (si es que persisten).

P: Para la primera parte, la pregunta se aplica a: ...

No, ahora lo estás haciendo innecesariamente complejo. Los campos de un objeto siempre son persistentes. Cómo se refieren a ellos no importa.

La referencia en sí misma puede no ser persistente, incluso si el objeto lo es. Puede estar en una matriz de objetos transitorios o variable local, por ejemplo. Si se pierden todas las referencias, entonces ya no se puede acceder al objeto y se vuelve elegible para la recolección de basura. Pero antes de que se recopile, permanecerá en la memoria persistente.

Supongo que los objetos que se almacenan directamente en una matriz de objetos transitorios no persisten. En este caso y suponiendo que los objetos en la pila son persistentes, ¿cuándo el objeto almacenado allí no se conserva? ¿Persiste en el nuevo objeto y no persiste cuando se coloca en la matriz de objetos transitorios?

Considera la respuesta anterior. Realmente no existe una "matriz de objetos transitorios". Lo que existe es una matriz que consiste en referencias a otros objetos. Estas referencias pueden ser transitorias o persistentes. Los objetos a los que se hace referencia pueden ser transitorios (matrices) o contener referencias a valores transitorios.

Los objetos en sí mismos generalmente no se convierten de persistentes a transitorios o viceversa . No les importa cómo se les hace referencia. Solo les importa si su recuento de referencias no se convierte en cero, porque luego se pierden y son elegibles para la recolección de basura. Por supuesto, esto es más probable si solo se hace referencia a ellos mediante una referencia volátil en una matriz de objetos transitorios o en una variable local.

La pila en sí está siempre en la memoria transitoria. Incluye todas las variables locales (incluidos los parámetros y los valores de retorno). Pero de nuevo: no contiene ningún objeto: puede contener referencias transitorias a objetos en el montón . Si esas referencias se pierden, entonces el objeto puede ser basura recolectada.


Notas:

  • Solo estoy hablando de la clásica Java Card aquí;
  • Java Card también contiene objetos especiales como el buffer APDU que tiene su propio ciclo de vida;
  • Por lo general, siempre usará referencias persistentes para señalar objetos, ya que no desea que la recolección de basura se ejecute en la Java Card a menos que sea en circunstancias excepcionales. - Las matrices transitorias se ponen a cero cuando se hace referencia después de un reinicio. El sistema operativo (debería) asegurarse de que siempre estén disponibles.
  • Las CLEAR_ON_RESETmatrices mantienen su contenido incluso si hay otros applets disponibles. Pero esto significa que los otros applets no pueden reutilizar esa memoria transitoria, y los applets son notoriamente hambrientos de RAM . Por lo tanto, debe utilizar de manera predeterminada las CLEAR_ON_DESELECTmatrices transitorias a menos CLEAR_ON_RESETque se requiera funcionalidad para los cambios de contexto .
Respuesta: 2

He creado una GUI usando Swing of Java. Ahora tengo que configurar una imagen sample.jpeg como fondo del marco en el que he colocado mis componentes. ¿Cómo hacer eso?

Es el bloque sincronizado en System.out.println (número); necesita el siguiente código? import java.util.concurrent.CountDownLatch; public class Main {private static final Object LOCK = new Object (); ...

I have been recently running into an issue in which my web application will not start properly and the stack trace doesn't indicate exactly what happened. I have been able to isolate it to an event ...

Estoy trabajando en un desafío de codificación en una aplicación bancaria donde necesito obtener el número de transacciones en los últimos 60 segundos. Para eso estoy usando java.sql.Timestamp como clave de un mapa como el siguiente: Mapa y ...