我是javacard编程的初学者,我使用Javacard实现了一个小程序 小程序运行3次而不取消选择小程序,然后我从小程序返回的响应数据中收到“0x6f00”? 这是记忆泄漏吗?
答案 0 :(得分:0)
当然,这可能是记忆的泄漏。但没有额外的知识,很难确定。它确实与applet中的state有关,否则你将不会有这样的行为。但这并不一定意味着内存泄漏。 “跑步”只有三次似乎并不多。
process
方法结尾处出现的任何未捕获的异常都会生成6F00
。此规则的唯一例外是ISOException
,它将转换为ISOException
实例中的原因所代表的状态字。由于JavaCard中的任何异常实际上都是RuntimeException
,因此很容易无法正确处理异常。
但很容易确定。在try
方法中创建catch
/ process
,抓住SystemException
并检查原因代码是SystemException.NO_RESOURCE
还是SystemException.NO_TRANSIENT_SPACE
。然后使用ISOException.throwIt(MY_OUT_OF_MEMORY_STATUS_WORD)
。这就是Java Card相当于或多或少地使用System.out
,如果它可用于您的Java Card运行时,您当然也可以使用调试器...
答案 1 :(得分:0)
行为是否可重复?如果是,请尝试检查您的代码,确保除了构造函数之外没有new
关键字。通过创建和使用名为“workBuffer”的公共缓冲区重用变量,和/或使用全局RAM缓冲区,如APDU缓冲区。
答案 2 :(得分:0)
小程序运行3次而不取消选择小程序,然后我从小程序返回的响应数据中收到“0x6f00”?
这是记忆泄漏吗?
可能。我的建议是不要在重复过程中初始化任何变量,比如,process(APDU apdu)方法。例如:
Public class ExampleClass extends Applet {
Public byte[] b1;
public byte[] b2;
...
public void process (APDU apdu){
b2 = new byte[5]; X
}
}
不鼓励上面因为每次你的applet使用process()处理传入的APDU时,javacard操作系统必须在卡片闪存中创建一个字节数组,这样就会非常快速地耗尽。最佳实践是在applet实例化中初始化变量,例如,在构造函数中。
答案 3 :(得分:0)
仅将此Byte数组初始化为构造函数(仅作为构造函数调用一次) " b2 =新字节[5];" 否则它将占用EEPROM每个进程(..)使用单独的数组调用。
最好的运气!