Java me j2me-内存不足异常,是否与最大堆或jar大小有关?

Java me j2me-内存不足异常,是否与最大堆或jar大小有关?,java-me,Java Me,我目前正在开发一个接受订单的应用程序。在我提问之前,让我向您介绍一下我的应用程序的基本功能: 用户登录后,应用程序要做的第一件事是从Web服务(产品、价格和客户)读取数据,以便用户可以脱机工作。 一旦用户拥有了所有必要的数据,他们就可以开始接受订单了。 最后,在一天结束时,用户将所有订单发送到服务器进行处理 现在你知道我的应用程序是如何工作的了,问题是: 当我在emulator中运行我的应用程序时,它可以工作,但现在当我从Web服务读取数据时,在上运行测试,屏幕上会出现以下错误: 内存不足错误j

我目前正在开发一个接受订单的应用程序。在我提问之前,让我向您介绍一下我的应用程序的基本功能:

用户登录后,应用程序要做的第一件事是从Web服务(产品、价格和客户)读取数据,以便用户可以脱机工作。 一旦用户拥有了所有必要的数据,他们就可以开始接受订单了。 最后,在一天结束时,用户将所有订单发送到服务器进行处理

现在你知道我的应用程序是如何工作的了,问题是: 当我在emulator中运行我的应用程序时,它可以工作,但现在当我从Web服务读取数据时,在上运行测试,屏幕上会出现以下错误:

内存不足错误java/lang/OutOfMemoryError 起初,我认为从WS(json格式)读取的数据对于StringBuffer来说太多了:

             hc = (HttpConnection) Connector.open(mUrl);

            if (hc.getResponseCode() == HttpConnection.HTTP_OK) {
                is = hc.openInputStream();
                int ch;
                while ((ch = is.read()) != -1) {
                    stringBuffer.append((char) ch);
                }
            }
但是,当我试图将WS(json格式的字符串)的结果转换为JSONArray时,出现了错误。 我这样做是因为我需要遍历所有对象(例如产品),然后使用RMS保存它们。以下是我使用的部分代码:

      rs = RecordStore.openRecordStore(mRecordStoreName, true);
            try {

                // This is the line that throws the exception
                JSONArray js = new JSONArray(data); 
               
                for (int i = 0; i < js.length(); i++) {

                    JSONObject jsObj = js.getJSONObject(i);
                    stringJSON = jsObj.toString();                   
                    id = saveRecord(stringJSON, rs);             


                }
稍微搜索一下,我发现了以下函数:
Runtime.getRuntime().freemory()
Runtime.getRuntime().totalMemory()

使用这些函数,我发现发生错误之前的总内存为:2097152,可用内存为:69584字节

现在最大的问题是:

  • 这少量的内存是从哪里获取的??堆大小?? 该设备的规格说明它有4MB
  • 另一件让我担心的事情是RMS是否会增加罐子的大小 因为说明书上还说最大的罐子大小是2 MB
  • 和往常一样,我非常感谢你的所有评论和建议


    提前感谢。

    我不知道确切原因是什么,但这些J2ME设备确实存在内存问题

    我的应用程序正在处理联系人,当我试图从服务器接收联系人的JSON时,如果转换时间太长,确实会导致内存不足错误


    我找到的解决方案是分页。将从服务器接收到的数据分成若干部分,然后逐部分阅读。

    Thank you@arseny。我很高兴我是对的,因为我最终还是按照你的建议做了。我首先读取记录的总数,然后以一个我确信不会有任何问题的数字分页这些记录。通过这些更改,我消除了“内存不足”的异常。然而,我仍然看到,我使用RMS保存的数据越多,jar就越大,这让我担心的是2MB@eddyjar只包含编译过的类和资源(图像、音频文件等)。它是只读的。RMS不存储在那里,操作系统将记录保存在不同的位置。但您必须查看资源文件的大小,因为正如您所说,存在最大jar大小限制。@MisterSmith先生奇怪的是,当我将jar复制到手机时,它只有64 KB(模糊),但在我写入记录存储后,设备屏幕显示128 KB。但是,如果我查看放置jar的文件夹,它的大小保持不变:64KB。有点confusing@eddy然后屏幕可能会列出其他内容(可能是应用程序使用的总存储)。但是罐子是只读的,毫无疑问。
        public int saveRecord(String stringJSON, RecordStore rs) throws JSONException {
                int id = -1;
                try {
                   
                    byte[] raw = stringJSON.getBytes();
                    id= rs.addRecord(raw, 0, raw.length);
                    
                } catch (RecordStoreException ex) {
                    System.out.println(ex);
                }
                return id;
            }