이 질문은 내 previous question에 대한 답변의 결과입니다.이미지가 캐싱되어 힙 공간을 먹고 있습니다.
Eclipse MAT를 사용하여 내 힙을 먹는 것을 조사하도록 요청 받았습니다. 다음은 내 관찰 (상위 소비자가) 있습니다
class sun.awt.SunToolkit 333.7 MB
com.tennisearth.service.impl.CacheManagerServiceImpl 136 MB
org.apache.jasper.servlet.JspServlet 91.5 MB
이미 CacheManageServiceImpl
으로 문제를 해결하지만, SunToolkit
와 도움을 필요로했다. 이하
Image img = new ImageIcon(imagePath).getImage();
int imageWidth = img.getWidth(null);
int imageHeight = img.getHeight(null);
Plz은 이미지 오브젝트 만 뒷부분 요구되는 이미지의 폭/높이를 얻기 위해 생성되는 것을 주목 (내부적 SunToolkit.imgCache
사용하는) 이미지 오브젝트를 생성하는 코드 어떤 논리.
SunToolkit
이미지 캐싱을 사용 중지하는 방법이 있습니까? 더 나은 방법은이 캐시를 지울 수있는 방법입니까? 아니면이 정보를 검색 할 수있는 더 나은 방법이 있습니까? 참조 용 BTW
java -Dprogram.name=run.sh -server -Xms256m -Xmx1024m -XX:PermSize=64m -XX:MaxPermSize=256m -verbose:gc -Xloggc:/data1/logs/jboss/GC.log -XX:+HeapDumpOnOutOfMemoryError -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000 -Dorg.apache.catalina.STRICT_SERVLET_COMPLIANCE=false -Djava.net.preferIPv4Stack=true -Djava.library.path=/usr/local/java/jboss-4.2.2.GA/bin/native -Djava.endorsed.dirs=/usr/local/java/jboss-4.2.2.GA/lib/endorsed -classpath /usr/local/java/jboss-4.2.2.GA/bin/run.jar:/usr/local/java/jdk1.6.0_06/lib/tools.jar org.jboss.Main -c default -b <IP_ADDRESS> -Djboss.messaging.ServerPeerID=1
수밋
Java에서 이미지 및 이미지 캐싱과 관련하여 * 많은 문제가 있습니다. API 결함 주위의 악명 높은 * flush() * 해결 방법이 마음에 들었습니다. 이미지를 무효화하는 것만으로는 충분하지 않은 경우가 있습니다. 때때로 * flush() *를 호출해야하며 때로는 의미가 없습니다. 서버에 있다면 ImageMagick의 * identify * 명령을 사용하여 폭/높이 정보를 얻을 수 있습니다. 외부 프로세스를 실행하는 데에는 약간의 고통이 따르지만 이미지를로드하는 것만으로 서버의 너비/높이를 얻는 것은 너무 무거울 수 있습니다. – SyntaxT3rr0r
또 다른 옵션 ... 우리는 모든 사진을 일괄 처리하고 사진의 파일 이름에 widht/height 정보를 직접 입력했습니다. * mypic.jpg *는 * mypic640x480.jpg *가됩니다. 그런 다음 파일 이름에서 (w, h)를 추출하면 ... – SyntaxT3rr0r
이 문제에 대한 Google의 의견은 흥미 롭습니다. * OS X 이외의 다른 플랫폼에서도 동일한 문제가 발생 했으므로 " GC가 이미지를 회수하기 전에 플러시를 강제 실행하기 위해 ToolkitImage에 대한 마무리 작업을 구현하여 Sun에서 적절한 수정 작업을 수행해야합니다. 아무도 이것을 Sun에보고 했습니까? * – SyntaxT3rr0r