我正在运行一个Web服务器来检索图像并对它们进行一些操作。在单元测试中一切正常,但是今天Web服务器没有响应,并且在进行线程转储时,我看到很多被阻塞的线程具有以下堆栈跟踪:
sun.java2d.SunGraphicsEnvironment.createGraphics(java.awt.image.BufferedImage) @bci=19, li
ne=181 (Compiled frame)
- sun.java2d.HeadlessGraphicsEnvironment.createGraphics(java.awt.image.BufferedImage) @bci=5, line=89 (Compiled frame)
- java.awt.image.BufferedImage.createGraphics() @bci=6, line=1154 (Compiled frame)
- (my package).getScaledInstance(java.awt.image.BufferedImage, int, int, java.lang.Object, boolean) @bci=113, line=120 (Compiled frame)
它坚持的(我的)代码行是:
BufferedImage tmp = new BufferedImage(w, h, type);
Graphics2D g2 = tmp.createGraphics();
createGraphics是否是线程安全的?我在官方javadocs中找不到任何文件说明它不是,但它确实看起来那样(并且考虑到它基于AWT,如果不是这样就不会感到惊讶)。还有什么可能导致线程像这样阻塞吗?
编辑:应该补充说我在Amazon EC2 Linux ami(默认版本)上运行,运行最新版本的java,
java -version
java version "1.7.0_11"
Java(TM) SE Runtime Environment (build 1.7.0_11-b21)
Java HotSpot(TM) 64-Bit Server VM (build 23.6-b04, mixed mode)