管理内存和对象
在一个Java Card设备中,内存是最重要的资源。 在一些Java Card中,实现一个垃圾收集程序可能不能使用。当一个对象被创建的时候,对象和它的内容被保存在非易失性存储器中,使之可在会话之间使用。在某些情况下,应用程序数据不需要持久- -它是暂时的或者瞬变的(transient)。为了减少智能卡的持久性内存的消耗,并且最大化它的生命周期,我们要尽可能的经常以transient更新数据。
Java Card技术不支持关键字transient。取而代之,Java Card应用编程接口(javacard.framework.JCSystem)定义了三个方法,允许你在运行时间创建transient数据,还定义了一个方法让你检查一个对象是否是transient的:
static byte[] makeTransientByteArray(short length, byte event) static Object makeTransientObjectArray(short length, byte event) static short[] makeTransientShortArray(short length, byte event) static byte isTransient(java.lang.Object theObj)
你可以创建一个瞬变的字节或者short基本数据类型的数组,你也可以创建一个瞬变Object。但是记住下面用于瞬变数据的行为:
一个瞬变对象的状态在会话之间不能持久保存。 注意内容(不是对象本身)是什么是瞬变的。和任何其他的Java语言对象一样,一个瞬变对象只要它被引用就一直存在。
当一个事件例如卡片复位或者小应用程序取消选择发生的时候,一个瞬变对象的内容可能重置为字段的缺省值(0、false或者null)。
因为安全的理由,瞬变对象的字段不被保存在持久内存中。
对瞬变对象字段的更新不是原子性的,不会受事务的影响。
在一个Java Card环境中,数组和基本类型应在对象声明中声明,并且你应该最小化对象实例化,以利于对象重用。实例化对象在小应用程序生命周期中只有一次,最好在小应用程序的初始化阶段,在小应用程序生命周期中只被调用一次的install()方法中。
为了促进对象的重用,对象应该保持在小应用程序的生命周期的范围内或引用中,并且它们的状态(成员变量的值)在重用之前根据情况重置。 因为垃圾收集程序并不总是可用的,一个应用程序可能从不回收分配给不太占用内存的对象的存储器。
持久的事务
JCRE支持原子事务,原子事务安全地更新一个或多个持久对象。如果发生掉电或者程序错误等情况,事务将保护数据的完整性。 事务是在系统级支持的,通过下面的方法:
JCSystem.beginTransaction() JCSystem.commitTransaction() JCSystem.abortTransaction()
在一个为许多事务模型所共用的模式中,一个Java Card事务以对beginTransaction()的调用开始,以对commitTransaction()或者abortTransaction()的调用结束。 让我们来看看使用这些应用程序编程接口的代码片断:
... private short balance; ... JCSystem.beginTransaction(); balance = (short)(balance + creditAmount); JCSystem.commitTransaction(); ...
实例变量balance的更新是为了保证一个原子操作。 如果一个程序错误或者电力重置等事件发生,这个事务就会保证前面的balance值余额被恢复。
JCRE不支持嵌套事务。
|