【发布时间】:2013-02-10 18:57:12
【问题描述】:
我在 java 中创建了一个 web 服务来返回 json 数据。好的,小数据没问题,但是当我处理大数据时,它会返回内存不足的错误。
查看我的代码:
public void getImages() throws Exception {
JSONObject o = new JSONObject();
JSONArray jsonArray = new JSONArray();
try {
Class.forName(DRIVERNAME);
conn = DriverManager.getConnection(URL, USER, PASS);
Statement s = connection.createStatement();
ResultSet r = s.executeQuery("select * from images");
while (r.next()) {
JSONObject obj = new JSONObject();
obj.put("id", r.getInt("id"));
byte[] iBytes = r.getBytes("image");
String iBase64 = DatatypeConverter.printBase64Binary(iBytes);
obj.put("image", iBase64);
jsonArray.put(obj);
}
o.put("images", jsonArray);
} catch (SQLException e) {
}
}
在 jsonArray 中添加图像时发生内存不足 (java.lang.OutOfMemoryError: Java heap space):
byte[] iBytes = r.getBytes("image");
String iBase64 = DatatypeConverter.printBase64Binary(iBytes);
obj.put("image", iBase64);
知道如何解决这个问题吗?
【问题讨论】:
-
要么不这样做,要么增加可用内存量。
-
您通常在一次通话中检索多少张图片,它们有多大?您当前的代码非常占用内存,如果您遇到 OOM 问题,那么您将需要增加程序可用的内存量,或改进逻辑以减少您尝试发送回客户端的数据量。
-
您确定要通过 json 传输图像字节数据吗?如果你真的想这样做,也许你可以设置图像大小的限制或调整它们的大小。
-
@Perception 该调用平均返回 2000 张图像。我需要将图像存储在应用程序移动设备上以供离线工作。所以,我不知道分页结果以避免内存不足。那么,有什么想法吗?
-
两千?这对于任何类型的应用程序来说都很多,更不用说移动应用程序了。您将遇到双方的内存问题。根据平均图像大小(您没有提到),您肯定需要对结果集进行分页。
标签: java json web-services tomcat out-of-memory