For loop Java卡内存在for循环中泄漏?

For loop Java卡内存在for循环中泄漏?,for-loop,memory-leaks,javacard,For Loop,Memory Leaks,Javacard,我知道Java卡虚拟机没有垃圾收集器,但是for循环会发生什么呢 for(short x=0;x<10;x++) {} 但是它比第一个版本稍微慢一点。如果我在for循环中为索引使用一个正态变量,那么它会变得非常慢 那么,第一个for循环中的x变量会发生什么情况?使用这样的循环安全吗?让我们简单介绍一下内存。简言之,智能卡中有3种类型的存储器,如下所示: ROM(有时是闪存) 电可擦可编程只读存储器 公羊 ROM: 该卡的操作系统和Java卡API以及一些工厂专有软件包存储在这里。此内

我知道Java卡虚拟机没有垃圾收集器,但是
for
循环会发生什么呢

for(short x=0;x<10;x++)
{}
但是它比第一个版本稍微慢一点。如果我在
for
循环中为索引使用一个正态变量,那么它会变得非常慢


那么,第一个
for
循环中的
x
变量会发生什么情况?使用
这样的循环安全吗?

让我们简单介绍一下内存。简言之,智能卡中有3种类型的存储器,如下所示:

  • ROM(有时是闪存)
  • 电可擦可编程只读存储器
  • 公羊
ROM:

该卡的操作系统和Java卡API以及一些工厂专有软件包存储在这里。此内存的内容是固定的,您不能修改它。在芯片生产过程中,在该存储器中的写入只发生一次,该过程称为掩蔽

EEPROM:

这是小程序加载到的可修改内存,由以下4个部分组成:

  • 文本:又称代码段,包含机器指令的程序。代码可以被看作是一本小说的文本:它讲述了程序所做的事情
  • 数据:包含程序的静态数据,即在整个程序执行过程中存在的变量。C或C++程序中的全局变量是静态的,如C、C++或java中声明为静态的变量。
  • HeAP:是一个内存池,用于动态分配内存,如用<代码> MARROCKE()/<代码> > C或<代码>新< /C> > C++和java。< /LI>
  • 堆栈:包含用作临时存储的系统堆栈
  • 无电(例如,撕卡)不会对该内存的内容产生任何影响

    内存:

    这也是一种可修改的内存类型。RAM和EEPROM之间有三个主要区别:

  • RAM确实比EEPROM快。(快1000倍)
  • RAM的内容将在断电时被破坏
  • EEPROM中的写入次数是有限的(通常为100.000次),而RAM的写入次数确实更高

  • 现在怎么办?


    当您为(短x=0;x写入
    时,
    x
    变量实际上不存在于字节码中。Java堆栈中的某个位置上存在表示
    x
    的操作(可以是Java字节码,也可以是Java卡转换器转换后的代码)。现在Java堆栈是一个虚拟堆栈。该堆栈在具有寄存器和非虚拟堆栈的CPU上实现。通常,如果有足够的可用寄存器,则变量
    x
    只需放入寄存器中,直到超出范围。寄存器当然可以重用。CPU堆栈本身是后进先出(后进先出)在瞬态内存(RAM)中排队。在执行构成小程序的字节码期间,堆栈不断增长和收缩。与寄存器一样,堆栈内存被反复使用。所有局部变量(在代码块内定义的变量以及方法参数)都以这种方式处理

    如果将变量放在瞬态数组中,则将变量放在基于RAM的堆中。Java卡RAM堆永远不会超出范围。这意味着,如果更新值,则需要将更改写入瞬态内存。当然,这比您发现的CPU寄存器的局部更新要慢打开。通常瞬时内存中的内存永远不会被释放。也就是说,您当然可以将内存用于其他目的,只要您有对数组的引用。请注意,引用本身(索引[0]
    中的
    索引
    )可能位于永久内存(EEPROM或闪存)或瞬时内存中

    不清楚“正常变量”是什么意思。如果这是用
    new
    创建的,或者它是对象实例中的一个字段,那么它会在持久内存(EEPROM或闪存)中的堆中保持不变.EEPROM和闪存的写入周期有限,写入EEPROM或闪存的速度比写入RAM的速度慢得多


    Java卡包含两种临时内存:CLEAR_ON_RESET和CLEAR_ON_DESELECT。两者之间的区别在于CLEAR_ON_RESET允许在小程序实例之间共享内存,而CLEAR_ON_DESELECT允许不同的小程序重用内存

    Java Card classic不包含在小程序执行期间运行的垃圾收集器,通常只能在启动期间使用
    JCSystem.requestObjectDelete()请求垃圾收集
    这将清理暂时内存和永久内存堆中不再引用的内存。清理内存意味着扫描所有内存,标记所有未引用的块,然后压缩内存。这类似于对硬盘进行碎片整理,可能需要很长时间


    ROM在制造阶段填充。它可能包含操作系统、Java卡API实现、字节码(包括常量)预加载的小程序等。它只能在字段中读取,因此对所问的问题没有任何影响。

    我不确定我的答案的某些部分。请等待其他朋友的评论:)当你为(简短的x=0;XY您已经将堆栈放在EEPROM中了。当然不是——它在RAM中。请注意,尽管Java VM是一个堆栈机器(即,它没有定义寄存器),但堆栈的实现方式可能是Java堆栈上的变量实际上被放入CPU寄存器中(非常快)。智能卡CPU没有太多的寄存器,因此在方法中使用太多变量可能会降低小程序的速度。@vojta谢谢。我将编辑或删除我的答案。我对EEPROM的部分也有错误吗?堆也在RAM中?W
    for(index[0]=0;index[0]<10;index[0]++)
    {}