瞬态存储器中的Java卡对象实例
我正在开发一个
Java Card applet(用于Java Card 2.2.1),它需要一些临时对象来处理APDU命令.我对正确的内存管理有疑问.
我花了很多时间研究这些问题,但是我没有在一些Java卡API上找到任何澄清或良好的示例代码.我有两个主要问题: >如何创建瞬态对象数组(我的意思是RAM中的自定义对象不在EEPROM中).我已经阅读了关于makeTransientObjectArray但它只返回Object类型的数组.我知道如何使用makeTransientByteArray创建例如瞬态字节数组,但我的问题是关于对象实例的瞬态数组.或者可能是java语言中的任何方式将字节数组转换为没有序列化的实例?
>正如我已从文档中读取的那样,任何对象实例都存储在EEPROM中.假设我知道我的过程算法中需要的最大对象数(比如说100).我在安装方法中生成了100个MyClass实例. MyClass的每个实例包含3个字段:field1 a short,field2 a byte,field3是short类型.所有这100个实例将通过输入APDU命令来填充.如果对于每个命令,我在EEPROM上填充对象,这不是一个好习惯,因为它们是临时数据. EEPROM还具有最大的循环周期.一种方法可能是,对于每个实例,我使用makeTransientByteArray和makeTransientShortArray为每个对象分配5个字节.但正如我从文档中读到的那样,它按簇(32字节 – 不确定大小)分配内存,这是无效的.那么在这种情况下我要做什么呢? 解决方法
不幸的是,在Java Card的经典规范中,您尝试做的事情是不可能的.对象实例总是存储在EEPROM中,正如您已经注意到的那样.所以你必须解决这个问题.
Java是一种相对高级的语言,其中对象总是存储在一个特定的内存中.现在他们已经将这种类型的内存更改为Java Card的持久内存.但是,它需要完全重新设计语言,以允许在一种类型的存储器或另一种存储器中构造对象.现在JCF当然可以考虑使用注释 – 它仍然非常棘手,但可能是可行的. 同样,不可能只通过一个进程方法使对象生存,甚至不能生成数组类型.要实现这一点,您可能需要添加堆或实时垃圾收集器.管理一个堆并且堆栈朝向彼此增长是很困难的,并且实时GC也不是当前经典实现中存在的东西.我们在这里处理一个极其受限制的环境. 所以基本上你必须解决平台的限制. 使用的一个好策略是创建包含临时内存或引用现有内存(如APDU缓冲区内的内存)的对象缓存.将在安装或个性化期间创建对象.然后可以在必要时检索这些对象,使用它们并将其返回到缓存.为了给您一个想法,请查看Java的ByteBuffer.wrap()方法,该方法允许您对现有数组的一部分执行缓冲区操作.现在考虑该类型的可重用对象. 另一个逻辑解决方案是根本不使用OO编程.嘿,OO都很好,花花公子,但我们谈论的芯片的RAM最大为8到10 KiB.会有限制.可以通过方法完成对象所能做的事情(实际上,你可以证明这就是情况,因为没有对象的Java无疑是图灵完备的,但是如果你坚持使用你的设计那就没什么安慰了) . 你的文字说明: >不,您不能将字节数组转换为对象实例.这将是Java和OO的所有原则.如果可能的话,包括数据封装在内的所有内容都将被破坏.您当然可以反序列化自己并将结果放在缓存中的对象中(参见上面的策略).>内存通常只应在安装或个性化期间分配,或者很可能在使用延迟实例化发布后分配一次.>您不需要100个活动对象.您只有一些对象需要在某个特定时间“活着”.利用这些信息!>内存分配特定于平台实现.肯定有平台具有较小的“集群”大小;平台通常会尝试在内存中对齐数据,因此它也取决于系统/芯片的设计.>使用CLEAR_ON_DESELECT创建的内存可供其他applet使用.如果选择它们,则不再需要此RAM.一个聪明的实现会将内存保留在堆上(仍然很棘手,但是嘿).如上所述,在选择实例后,这变得可用.只有在选择了applet之后才会调用process方法(即使是处理初始的SELECT APDU本身). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |