这个问题是双重的,但希望尽管答案长度不长,但答案应该不会太长。不过,您只能随意回答其中的一部分,对不起,因为它太详尽了!
对于第一部分,该问题适用于:
Applet
中的对象Applet
中的对象Applet
都没有引用,甚至不能引用)makeTransientObjectArray
构建的数组中的对象makeTransientObjectArray
构建(例如,存储在makeTransientObjectArray
中存储的对象的成员变量中)对于第二部分,它取决于第一个问题的答案。例如:
new Object
上持久存在并且不持久?
提前谢谢!
我已经研究了JCRE规范v2.2.2(我正在使用的版本),但是其中有些地方尚不清楚(因此,这个问题的详尽无遗,因为我觉得这更适合Q / A型论坛):
Applet
中时,JCRE会使该对象持久化。但是,词汇表7指出默认情况下对象是持久性的。这种差异看似不可观察,但无论如何需要重新启动卡,都会影响是否进行垃圾收集。Applet
中时,第5-1页的相同语句可能与第2-2页冲突。这三个问题分别等于:
答案 0 :(得分:3)
Q :哪些对象被保留?哪些对象是瞬态的?
所有对象实例字段在使用new
创建时都是持久性的。 JRE创建的对象可能不是:您必须查看Java Card或OS文档才能找到。请注意,其他对象的字段是引用。这些引用本身可能指向瞬态内存中的数组或包含易失状态的其他对象。
如果数组已创建或定义为瞬态(通常通过调用makeTransientXxxArray()
),则它们是瞬态的。使用new
创建它们时,它们是持久的。
Q :对象何时保留?
创建时或进行任何更新时。通常,持久性值仅存储在持久性存储器中:闪存或EEPROM。对闪存或EEPROM的任何写操作都将直接保留。请注意,Java Card事务处理机制仍然可以回滚对持久内存的更改。
这与Java SE完全不同,在Java SE中,对象实例存储在RAM中,因此在创建和每次更新后都需要持久保存 (如果它们完全持久保存)。
问: 对于第一部分,该问题适用于:...
不,现在您将其变得不必要地复杂。对象的字段始终保持不变。 引用的方式无关紧要。
引用本身可能不是持久性的,即使对象是持久性的。例如,它可以在瞬时对象数组或局部变量中。如果丢失所有引用,则该对象将无法再访问,并且可以进行垃圾回收。但是在被收集之前,它仍将保留在永久内存中。
我假设直接存储在瞬态对象数组中的对象没有持久化。在这种情况下,并假设堆栈上的对象是持久性的,那么存储在其中的对象何时不持久化?
将它保留在新对象上并且在持久对象中不持久化吗?
考虑上一个答案。确实没有所谓的“瞬态对象数组”。存在的数组是由对其他对象的引用组成的。这些引用可以是瞬时的也可以是持久的。引用的对象可以是瞬态(数组),也可以包含对瞬态值的引用。
对象本身通常不会从持久性转换为瞬态,反之亦然。他们不在乎如何引用它们。他们只在乎其参考计数是否不为零,因为这样它们会丢失并有资格进行垃圾回收。如果它们只是被瞬态对象数组或局部变量中的易失性引用所引用,则这种可能性当然更大。
堆栈本身始终位于瞬态内存中。它包括所有局部变量(包括参数和返回值)。但又一次:它不包含任何对象:它可能只包含对堆中对象的临时引用。如果这些引用丢失,则该对象可能会被垃圾回收。
注意:
CLEAR_ON_RESET
数组也会保留其内容。但是,这意味着其他小程序无法重用该临时内存,并且众所周知,小程序内存不足。。因此,除非上下文切换需要CLEAR_ON_DESELECT
功能,否则您应该默认使用CLEAR_ON_RESET
瞬态数组。答案 1 :(得分:0)
有一个很好的文档,可以从oracle.com免费下载,标题为“ Java Card 3 Platform Runtime Environment Specification”