1

我是 javacard 编程的初学者,我已经使用 Javacard 实现了一个小程序。
小程序运行3次没有取消选择小程序然后我在小程序返回的响应数据中收到“0x6f00”?
这是内存泄漏吗?

4

4 回答 4

1

当然,这可能是内存泄漏。但是如果没有额外的知识,就很难确定。它似乎与小程序中的状态有关,否则您将不会有这种行为。但这并不一定意味着内存泄漏。“跑”三遍似乎也不算多。

方法末尾出现的任何未捕获的异常都process将生成一个6F00. 此规则的唯一例外是ISOException它将转换为由ISOException实例中的原因表示的状态字。由于 JavaCard 中的任何异常实际上都是一个RuntimeException,因此很容易无法正确处理异常。

但很容易确定。在方法中创建try/ ,捕获并检查原因码是否为或。然后使用. 这相当于使用或多或少的 Java Card,如果它可用于您的 Java Card 运行时,您当然也可以使用调试器......catchprocessSystemExceptionSystemException.NO_RESOURCESystemException.NO_TRANSIENT_SPACEISOException.throwIt(MY_OUT_OF_MEMORY_STATUS_WORD)System.out

于 2013-07-28T20:08:09.957 回答
1

小程序运行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 操作系统必须在卡闪存中创建一个字节数组,这样会很快耗尽。最佳实践是在小程序实例化中初始化变量,例如在构造函数中。

于 2015-04-29T10:07:40.143 回答
0

行为是否可重复?new如果是,请尝试检查您的代码,确保除了构造函数之外没有关键字。通过创建和使用称为“workBuffer”的公共缓冲区和/或使用全局 RAM 缓冲区(例如 APDU 缓冲区)来重用变量。

于 2013-07-31T11:45:46.763 回答
0

仅将此 Byte 数组初始化为构造函数(构造函数仅调用一次)“b2 = new byte[5];” 否则,每个 Process(..) 调用都会占用 EEPROM,并使用单独的数组。

祝你好运!

于 2015-05-04T06:38:31.217 回答