哪些对象在Java Card中是持久的,何时?

时间:2018-08-21 16:18:58

标签: java smartcard javacard

这个问题是双重的,但希望尽管答案长度不长,但答案应该不会太长。不过,您只能随意回答其中的一部分,对不起,因为它太详尽了!

  • 保留哪些对象?哪些对象是瞬态的?
  • 对象何时保留?

对于第一部分,该问题适用于:

  • 存储在Applet中的对象
  • 可暂时存储在Applet中的对象
  • 仅存储在堆栈变量中的对象(甚至从任何Applet都没有引用,甚至不能引用)
  • 存储在使用makeTransientObjectArray构建的数组中的对象
  • 以可传递方式存储在数组中的对象使用makeTransientObjectArray构建(例如,存储在makeTransientObjectArray中存储的对象的成员变量中)

对于第二部分,它取决于第一个问题的答案。例如:

  • 我假设直接存储在瞬态对象数组中的对象不会保留。在这种情况下,并假设堆栈上的对象是持久性的,那么存储在其中的对象何时不持久化?
  • 放置在瞬态对象数组中时,它是否在new Object上持久存在并且不持久?
  • 如果对象同时具有瞬时对象数组和applet的引用,并且applet引用被删除,则该对象是否不持久?

提前谢谢!


我已经研究了JCRE规范v2.2.2(我正在使用的版本),但是其中有些地方尚不清楚(因此,这个问题的详尽无遗,因为我觉得这更适合Q / A型论坛):

  • 第2-2页提到,当JCRE可传递地存储在Applet中时,JCRE会使该对象持久化。但是,词汇表7指出默认情况下对象是持久性的。这种差异看似不可观察,但无论如何需要重新启动卡,都会影响是否进行垃圾收集。
  • 第5-1页指出瞬态对象的字段绝不能存储在持久性内存中。但是,它没有说明对于瞬态对象数组中的可传递对象是否也是如此。存储在瞬态对象数组中的对象字段中的对象。
  • 当对象将对它的引用存储在临时对象数组和Applet中时,第5-1页的相同语句可能与第2-2页冲突。

这三个问题分别等于:

  • 第1部分的要点3和5(以及答案,第2部分的要点1)
  • 第1部分的要点5
  • 第2部分要点2

2 个答案:

答案 0 :(得分:3)

  

Q 哪些对象被保留?哪些对象是瞬态的?

所有对象实例字段在使用new创建时都是持久性的。 JRE创建的对象可能不是:您必须查看Java Card或OS文档才能找到。请注意,其他对象的字段是引用。这些引用本身可能指向瞬态内存中的数组或包含易失状态的其他对象。

如果数组已创建或定义为瞬态(通常通过调用makeTransientXxxArray()),则它们是瞬态的。使用new创建它们时,它们是持久的。

  

Q 对象何时保留?

创建时或进行任何更新时。通常,持久性值仅存储在持久性存储器中:闪存或EEPROM。对闪存或EEPROM的任何写操作都将直接保留。请注意,Java Card事务处理机制仍然可以回滚对持久内存的更改。

这与Java SE完全不同,在Java SE中,对象实例存储在RAM中,因此在创建和每次更新后都需要持久保存 (如果它们完全持久保存)。

  

问: 对于第一部分,该问题适用于:...

不,现在您将其变得不必要地复杂。对象的字段始终保持不变。 引用的方式无关紧要。

引用本身可能不是持久性的,即使对象是持久性的。例如,它可以在瞬时对象数组或局部变量中。如果丢失所有引用,则该对象将无法再访问,并且可以进行垃圾回收。但是在被收集之前,它仍将保留在永久内存中。

  

我假设直接存储在瞬态对象数组中的对象没有持久化。在这种情况下,并假设堆栈上的对象是持久性的,那么存储在其中的对象何时不持久化?

将它保留在新对象上并且在持久对象中不持久化吗?

考虑上一个答案。确实没有所谓的“瞬态对象数组”。存在的数组是由对其他对象的引用组成的。这些引用可以是瞬时的也可以是持久的。引用的对象可以是瞬态(数组),也可以包含对瞬态值的引用。

对象本身通常不会从持久性转换为瞬态,反之亦然。他们不在乎如何引用它们。他们只在乎其参考计数是否不为零,因为这样它们会丢失并有资格进行垃圾回收。如果它们只是被瞬态对象数组或局部变量中的易失性引用所引用,则这种可能性当然更大。

堆栈本身始终位于瞬态内存中。它包括所有局部变量(包括参数和返回值)。但又一次:它不包含任何对象:它可能只包含对堆中对象临时引用。如果这些引用丢失,则该对象可能会被垃圾回收。


注意:

  • 我只是在这里谈论经典 Java卡;
  • Java卡还包含特殊对象,例如具有其自身生命周期的APDU缓冲区;
  • 通常,您将始终使用持久引用指向对象,因为除非在特殊情况下,否则您不希望垃圾回收在Java Card上运行。 -重置后引用瞬态数组时,它们将为零。操作系统(应)确保它们始终可用。
  • 即使其他小程序可用,CLEAR_ON_RESET数组也会保留其内容。但是,这意味着其他小程序无法重用该临时内存,并且众所周知,小程序内存不足。。因此,除非上下文切换需要CLEAR_ON_DESELECT功能,否则您应该默认使用CLEAR_ON_RESET瞬态数组。

答案 1 :(得分:0)

有一个很好的文档,可以从oracle.com免费下载,标题为“ Java Card 3 Platform Runtime Environment Specification”