Java me j2me-内存不足异常,是否与最大堆或jar大小有关?
我目前正在开发一个接受订单的应用程序。在我提问之前,让我向您介绍一下我的应用程序的基本功能: 用户登录后,应用程序要做的第一件事是从Web服务(产品、价格和客户)读取数据,以便用户可以脱机工作。 一旦用户拥有了所有必要的数据,他们就可以开始接受订单了。 最后,在一天结束时,用户将所有订单发送到服务器进行处理 现在你知道我的应用程序是如何工作的了,问题是: 当我在emulator中运行我的应用程序时,它可以工作,但现在当我从Web服务读取数据时,在上运行测试,屏幕上会出现以下错误: 内存不足错误java/lang/OutOfMemoryError 起初,我认为从WS(json格式)读取的数据对于StringBuffer来说太多了:Java me j2me-内存不足异常,是否与最大堆或jar大小有关?,java-me,Java Me,我目前正在开发一个接受订单的应用程序。在我提问之前,让我向您介绍一下我的应用程序的基本功能: 用户登录后,应用程序要做的第一件事是从Web服务(产品、价格和客户)读取数据,以便用户可以脱机工作。 一旦用户拥有了所有必要的数据,他们就可以开始接受订单了。 最后,在一天结束时,用户将所有订单发送到服务器进行处理 现在你知道我的应用程序是如何工作的了,问题是: 当我在emulator中运行我的应用程序时,它可以工作,但现在当我从Web服务读取数据时,在上运行测试,屏幕上会出现以下错误: 内存不足错误j
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字节
现在最大的问题是:
提前感谢。我不知道确切原因是什么,但这些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;
}