Javacard内存泄漏。

时间:2013-07-28 13:17:28

标签: applet javacard

我是javacard编程的初学者,我使用Javacard实现了一个小程序 小程序运行3次而不取消选择小程序,然后我从小程序返回的响应数据中收到“0x6f00”? 这是记忆泄漏吗?

4 个答案:

答案 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”?

  • 它应该是从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
        }    
    }
    

    不鼓励上面因为每次你的applet使用process()处理传入的APDU时,javacard操作系统必须在卡片闪存中创建一个字节数组,这样就会非常快速地耗尽。最佳实践是在applet实例化中初始化变量,例如,在构造函数中。

答案 3 :(得分:0)

仅将此Byte数组初始化为构造函数(仅作为构造函数调用一次) " b2 =新字节[5];" 否则它将占用EEPROM每个进程(..)使用单独的数组调用。

最好的运气!