ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

Java Card中的内存分配

2019-06-09 05:47:08  阅读:280  来源: 互联网

标签:java arrays memory javacard


我有一张Java Card智能卡,我想评估可用的EEPROM.

为此,我使用函数JCSystem.getAvailableMemory(JCSystem.MEMORY_TYPE_PERSISTENT).
由于此函数的返回值很短,没有分配任何数据,我得到值0x7FFF.为了解决这个问题,我用这种方式创建字节数组:新字节[(短)0x7FFF]来推断可用的持久内存.

如果我创建两个数组:

arr1 = new byte[(short) 0x7FFF];
arr2 = new byte[(short) 0x7FFF];

然后根据JCSystem.getAvailableMemory(JCSystem.MEMORY_TYPE_PERSISTENT),它占用0x1144字节的可用内存.因此,如果我求和,则意味着有32767 * 2 4420 = 69954字节可用.

但是当我改变数组的大小时:

arr1 = new byte[(short) 0x7FFF];
arr2 = new byte[(short) 0x6FFF];

然后它占用0x2244字节的可用内存.因此,如果我求和,则意味着有70210个字节可用.

另一个例子:

arr1 = new byte[(short) 0x7FFF];
arr2 = new byte[(short) 0x5FFF];

它占用0x3344字节的可用内存.因此,如果我总结它意味着有70466字节可用.

即使它可以忽略不计,为什么会出现这些差异呢? (70210与70466不同).

同样,我想测试一下我可以在一个applet中分配多少AESKey.所以我尝试找到我之前描述的可用内存,但是使用AESKey数组.

使用相同的卡,当我以这种方式创建AESKey阵列时:

arr = new AESKey[(short) 0x03E8];
for (short i = 0x0000; i < 0x03E8; i++) {
  arr[i] = (AESKey) KeyBuilder.buildKey(KeyBuilder.TYPE_AES,  KeyBuilder.LENGTH_AES_256, false);
}

所以我创建了一个256位AESKey的数组.我认为它需要32Ko,但方法JCSystem.getAvailableMemory(JCSystem.MEMORY_TYPE_PERSISTENT)表示有0x0022字节可用.为什么会这样?

如果我用半键测试(例如500):

arr = new AESKey[(short) 0x01F4];
for (short i = 0x0000; i < 0x01F4; i++) {
   arr[i] = (AESKey) KeyBuilder.buildKey(KeyBuilder.TYPE_AES,  KeyBuilder.LENGTH_AES_256, false);
}

方法JCSystem.getAvailableMemory(JCSystem.MEMORY_TYPE_PERSISTENT)表示有可用的0x55EE(21998)字节:如果可用的EEPROM大约70Ko,就像我在开头解释的那样,当我创建1000个密钥时,我肯定看不到与该情况的关系. …

有人可以详细描述如何在Java Card中分配内存来解释上面引用的结果吗?

解决方法:

这有几个原因:

>有对象分配开销;
>对齐数据可能会有开销;
>内存碎片可能会有开销;
>对于密钥,可能存在保护其安全的开销.

所有这些问题都会减少您可用的内存量.在这方面,您应该将getAvailableMemory视为可用内存最大量的粗略指示.

需要多少开销取决于Java Card运行时.

标签:java,arrays,memory,javacard
来源: https://codeday.me/bug/20190609/1203098.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有