瞬态存储器中的Java卡对象实例
作者:互联网
我正在开发一个Java Card applet(用于Java Card 2.2.1),它需要一些临时对象来处理APDU命令.我对正确的内存管理有疑问.
我花了很多时间研究这些问题,但是我没有在一些Java卡API上找到任何澄清或良好的示例代码.我有两个主要问题:
>如何创建瞬态对象数组(我的意思是RAM中的自定义对象不在EEPROM中).我已经阅读了关于makeTransientObjectArray但它只返回Object类型的数组.我知道如何使用makeTransientByteArray创建例如瞬态字节数组,但我的问题是关于对象实例的瞬态数组.或者可能是java语言中的任何方式将字节数组转换为没有序列化的实例?
>我只在进入APDU命令的过程中需要这个瞬态对象数组,而不需要为我分配内存.分配此瞬态内存的最佳位置在哪里(内部安装,选择,处理,…功能)?
Edited for more explanations:
>正如我已从文档中读取的那样,任何对象实例都存储在EEPROM中.假设我知道我的过程算法中需要的最大对象数(比如说100).我在安装方法中生成了100个MyClass实例. MyClass的每个实例包含3个字段:field1 a short,field2 a byte,field3是short类型.所有这100个实例将通过输入APDU命令来填充.如果对于每个命令,我在EEPROM上填充对象,这不是一个好习惯,因为它们是临时数据. EEPROM还具有最大的循环周期.一种方法可能是,对于每个实例,我使用makeTransientByteArray和makeTransientShortArray为每个对象分配5个字节.但正如我从文档中读到的那样,它按簇(32字节 – 不确定大小)分配内存,这是无效的.那么在这种情况下我要做什么呢?
>我的意思是如何处理瞬态记忆.如果在安装功能内部分配瞬态内存,则其他小程序将无法使用.如果applet是Card上唯一的一个applet,那么在安装函数中分配所有瞬态内存是一个好习惯.我想知道所有条件的一般有效方法(单小程序设备或多小程序设备).此外,我不确定,如果在卡读卡器中插入卡,如果在安装中分配的瞬态内存将在处理功能内部可用.
解决方法:
不幸的是,在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本身).
标签:smartcard,java,javacard 来源: https://codeday.me/bug/20190731/1586163.html