아파치 커먼즈 파일 업로드를 사용하여 다중 파일 업로드를 수행하기 위해 서블릿을 사용하고 있습니다. 내 코드의 일부가 아래에 게시됩니다. 내 문제는 한 번에 여러 파일을 업로드하면 앱 서버의 메모리 사용량이 급격히 증가한다는 것입니다. 이것은 파일 업로드가 끝날 때까지만 가능하지만 앱 서버가 메모리에 매달려서 OS로 되돌려 보내지 않는 것처럼 보이는 것이 좋습니다. 나는 이것을 생산에 넣었을 때 서버에서 메모리 부족 예외가 발생하게 될 것이라고 걱정합니다. 왜 이런 일이 일어나고 있는지에 대한 아이디어가 있습니까? 나는 서버가 세션을 시작했을 것으로 생각하고 그것이 만료 된 후에 메모리를 되돌려 줄 것이다. 그러나 나는 100 % 긍정적이지 않다.서블릿 파일 업로드 메모리 사용량
if (ServletFileUpload.isMultipartContent(request)) {
ServletFileUpload upload = new ServletFileUpload();
FileItemIterator iter = upload.getItemIterator(request);
while (iter.hasNext()) {
FileItemStream license = iter.next();
if (license.getFieldName().equals("upload_button") || license.getName().equals("")) {
continue;
}
// DataInputStream stream = new DataInputStream(license.openStream());
InputStream stream = license.openStream();
List<Integer> byteArray = new ArrayList<Integer>();
int tempByte;
do {
tempByte = stream.read();
byteArray.add(tempByte);
} while (tempByte != -1);
stream.close();
byteArray.remove(byteArray.size() - 1);
byte[] bytes = new byte[byteArray.size()];
int i = 0;
for (Integer tByte : byteArray) {
bytes[i++] = tByte.byteValue();
}
}
}
미리 감사드립니다.
@skaffman과 @ Bozho의 제안을 반영하도록 코드를 업데이트했습니다. 이제는 사용자 정의 매개 변수를 전달하는 DiskFileItemFactory를 사용하여 ServletFileUpload 객체를 만듭니다. 나는 또한 올바른 방법으로 InputStream을 처리하고 finally 블록에서이를 닫는다. 그러나 여전히 문제가 해결되지 않은 것 같습니다. 여기 내가 생각할 수있는 일이 있습니다. 더비 데이터베이스를 사용하고 있는데이 서버는 서버와 동일한 스레드에서 열리는 것으로 보입니다. 나는 또한 물체를 얼룩으로 저장하고있다. 데이터베이스 자체가 메모리로 읽혀지고 보유되고 있습니까 ?? 지금까지 모든 위대한 의견에 감사드립니다! Scott – Scott
솔루션을 찾을 수 있었습니까? 나는 똑같은 문제를 겪고있다! –
한 가지 질문으로 유명한 SO-ers를 보지 못했습니다. – gkiko