编程语言
首页 > 编程语言> > 哪些对象在Java Card中持久存在,何时?

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

作者:互联网

这个问题是双重的,但希望尽管有自己的长度,但不应该无理由地回答.尽管如此,请尽量回答其中的一部分,并且对于让它如此详尽而言感到遗憾!

>哪些对象持久存在?哪些物体是短暂的?
>什么时候对象持续存在?

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

>存储在Applet中的对象
>传递存储在Applet中的对象
>仅存储在堆栈变量中的对象(未参考,甚至可以从任何Applet传递)
>存储在使用makeTransientObjectArray构建的数组中的对象
>使用makeTransientObjectArray传递存储在数组中的对象(例如,存储在存储在makeTransientObjectArray中的对象的成员变量中)

对于第二部分,它适用于第一个问题的答案.例如:

>我假设直接存储在瞬态对象数组中的对象不会被持久化.在这种情况下,假设堆栈中的对象是持久的,那么存储在那里的对象何时变得不持久?它是否在新的Object中持久存在并且在放入瞬态对象数组时不会持久化?
>如果一个对象具有来自瞬态对象数组和applet的引用,并且该applet引用被删除,该对象是否会被持久化?

先感谢您!

我已经研究了JCRE规范v2.2.2(我正在使用的版本),但有一些不清楚的地方(因此这个问题的详尽性,因为我认为这更适合Q / A风格论坛):

>第2-2页提到JCRE在传递存储在Applet中时使对象持久化.但是,Glossary-7声明对象在默认情况下是持久的.这种差异可能看起来不可观察,但无论如何都需要卡片电源循环,这会影响垃圾收集的需要.
>第5-1页指出瞬态对象的字段绝不能存储在持久性内存中.但它没有说明对于瞬态对象数组中的对象是否也是如此,例如.存储在瞬态对象数组中的对象字段中的对象.
>第5-1页,相同的语句可能与第2-2页冲突,当一个对象对它的引用存储在瞬态对象数组和Applet中时.

这三个问题分别相当于:

>第1部分要点3和5(根据答案,第2部分要点1)
>第1部分要点第5点
>第2部分要点2

解决方法:

Q: Which objects are persisted? Which objects are transient?

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

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

Q: When is an object persisted?

在创建时或在任何更新期间.通常,持久值只是放在持久性存储器中:闪存或EEPROM.对闪存或EEPROM的任何写入都将直接保留.请注意,Java Card事务机制仍然可以回滚对持久性内存的更改.

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

Q: For the first part, the question applies to: …

不,现在你把它变得不必要地复杂了.对象的字段始终保持不变.它们如何被提及并不重要.

即使对象是,引用本身也可能不是持久的.例如,它可能位于瞬态对象数组或局部变量中.如果所有引用都丢失,则无法再访问该对象,并且它有资格进行垃圾回收.但在收集它之前,它仍将保留在持久性存储器中.

I assume objects that are directly stored in a transient object array are not persisted. In this case and assuming objects on the stack are persisted, when does the object stored there become not-persisted? Is it persisted at the new Object and un-persisted when being put into the transient object array?

考虑前面的答案.实际上没有“瞬态对象阵列”这样的东西.存在的是一个由对其他对象的引用组成的数组.这些引用可能是暂时的或持久的.引用的对象可以是瞬态(数组)或包含对瞬态值的引用.

对象本身通常不会从持久转换为瞬态,反之亦然.他们不关心如何引用它们.他们只关心他们的引用计数是否为零,因为它们会丢失并且有资格进行垃圾回收.如果它们仅由瞬态对象数组或局部变量中的易失性引用引用,那么这当然更有可能.

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

笔记:

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

标签:java,smartcard,javacard
来源: https://codeday.me/bug/20190627/1303733.html