나는 최근까지 작업 한 오래된 코드를 가지고 있지만, 그것은 6.는 파일 기술자를 떠날 것으로 보인다
문제가 보인다 오픈 JDK 6보다는 자바 SE 사용하여 새 서버에서 실행하는 것이 지금 발프 보인다 JAI.create를 중심으로 나는 jpeg 파일을 내가 스케일 및 png 파일을 변환합니다. 이 코드는 누수없이 작동하지만 OpenJDK를 실행하는 상자로 옮겨 졌기 때문에 파일 설명자가 닫히지 않는 것처럼 보입니다. 점점 더 많은 tmp 파일이 서버의 tmp 디렉토리에 누적되는 것을 볼 수 있습니다. 이것들은 내가 만드는 파일이 아니기 때문에 JAI가 그것을하는 것으로 가정합니다.
또 다른 이유는 새 서버에서 더 큰 힙 크기 일 수 있습니다. JAI가 마무리 작업을 정리하지만 GC가 자주 발생하지 않는다면 파일이 쌓일 수 있습니다. 힙 크기를 줄이는 것은 선택 사항이 아니며 증가하는 ulimit와 관련없는 문제가있는 것 같습니다. 여기
내가이 프로그램을 실행할 때 누수 파일의 예 :/tmp/imageio7201901174018490724.tmp
일부 코드 :
// Processor is an internal class that aggregates operations
// performed on the image, like resizing
private byte[] processImage(Processor processor, InputStream stream) {
byte[] bytes = null;
SeekableStream s = null;
try {
// Read the file from the stream
s = SeekableStream.wrapInputStream(stream, true);
RenderedImage image = JAI.create("stream", s);
BufferedImage img = PlanarImage.wrapRenderedImage(image).getAsBufferedImage();
// Process image
if (processor != null) {
image = processor.process(img);
}
// Convert to bytes
bytes = convertToPngBytes(image);
} catch (Exception e){
// error handling
} finally {
// Clean up streams
IOUtils.closeQuietly(stream);
IOUtils.closeQuietly(s);
}
return bytes;
}
private static byte[] convertToPngBytes(RenderedImage image) throws IOException {
ByteArrayOutputStream out = null;
byte[] bytes = null;
try {
out = new ByteArrayOutputStream();
ImageIO.write(image, "png", out);
bytes = out.toByteArray();
} finally {
IOUtils.closeQuietly(out);
}
return bytes;
}
내 질문
은 다음과 같습니다- 사람이로 실행하고 그것을 해결 했습니까? 생성 된 tmp 파일은 내 것이 아니기 때문에, 나는 그들의 이름이 무엇인지 모르기 때문에 그들에 관해서는 아무 것도 할 수 없다.
- 이미지 크기를 조정하고 이미지를 다시 포맷 할 때 선택하는 라이브러리는 무엇입니까? 나는 Scalr에 대해 들었다.
차라리이 시간에 이전 코드를 rewite 아닌 것 다른 선택의 여지가없는 경우 ...
감사합니다!
그래서이 경우에는'iis.close()'를 명시 적으로 호출했는데 문제가 해결 되었습니까? – rogerdpack
@rogerdpack 아아, 오래 전이었고, 내가 한 일을 떠 올릴 수 없습니다. 나는 대답이 암시하는 것 같아, 나는 그것이 실제로 내가 한 일인지 확인할 수 없다. 죄송합니다. – MrSilverSnorkel