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