Taj*_*tos 2 memory-leaks for-loop javacard
我知道Java Card VM没有垃圾收集器,但for循环会发生什么:
for(short x=0;x<10;x++)
{}
Run Code Online (Sandbox Code Playgroud)
循环x后变量是否被利用for,或变成垃圾?
以防我有一个index从2的大小(而不是i在for循环中)调用的瞬态字节数组,我在for循环中使用该数组:
for(index[0]=0;index[0]<10;index[0]++)
{}
Run Code Online (Sandbox Code Playgroud)
但它比第一个版本慢一点.如果我在for循环中使用正常变量作为索引,那么它变得非常慢.
那么,x第一个for循环中的变量会发生什么?使用这样的for循环是否安全?
该x变量实际上并不存在于字节代码中.Java堆栈中的某个位置上有一些操作x(无论是Java字节代码还是Java Card转换器转换后的代码).现在Java堆栈是一个虚拟堆栈.该堆栈在具有寄存器和非虚拟堆栈的CPU上实现.通常,如果有足够的寄存器可用,则将变量x简单地放入寄存器中,直到它超出范围.寄存器当然可以重复使用.CPU堆栈本身是瞬态存储器(RAM)中的LIFO(后进先出)队列.在执行构成Applet的字节代码期间,堆栈会不断增长和缩小.与寄存器一样,堆栈存储器一遍又一遍地重复使用.所有局部变量(在代码块内定义的变量以及方法参数)都以这种方式处理.
如果将变量放在瞬态数组中,则将变量放在基于RAM的堆上.Java Card RAM堆永远不会超出范围.这意味着如果更新需要将更改写入瞬态内存的值.当然,这比通过实验发现的CPU寄存器的本地化更新要慢.通常,瞬态存储器中的存储器永远不会被释放.也就是说,只要您有对数组的引用,您当然可以将内存重用于其他目的.请注意,引用本身(indexin index[0])可以在永久存储器(EEPROM或闪存)或瞬态存储器中.
目前还不清楚你对"正常变量"的意思.如果这是用对象实例中new的字段创建的,或者如果它是对象实例中的字段,那么它将在持久存储器(EEPROM或闪存)中保留在堆中.EEPROM和闪存具有有限的写周期,写入EEPROM或闪存比写入RAM 要慢得多.
Java Card包含两种瞬态内存:CLEAR_ON_RESET和CLEAR_ON_DESELECT.两者之间的区别在于CLEAR_ON_RESET允许在Applet实例之间共享内存,而CLEAR_ON_DESELECT允许内存由不同的Applet重用.
Java Card classic不包含在Applet执行期间运行的垃圾收集器,通常只能在启动期间请求垃圾收集,JCSystem.requestObjectDeletion()这将清除不再引用的内存,无论是在瞬态内存中的堆上还是在持久性内存中记忆.清理内存意味着扫描所有内存,标记所有未引用的块,然后压缩内存.这类似于对硬盘进行碎片整理; 它可能需要一段令人不安的长时间.
ROM在制造阶段被填充.它可能包含操作系统,Java Card API实现,预加载applet的字节代码(包括常量)等.它只能在字段中读取,因此对所提出的问题没有任何影响.