ImageIO并发情况下内存溢出问题(jdk1.7以下)

博客讲述了在JDK 1.7环境下,使用ImageIO进行并发读取图片时出现内存疯狂增长的问题。通过对比发现,升级到JDK 1.8后,内存使用恢复正常。作者推测JDK 1.7的ImageIO在并发使用时存在潜在问题,并建议遇到类似问题的开发者考虑升级JDK或调整并发策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这几天在查一个内存溢出的问题,虽然不能确定到底是不是溢出了,但是jvm占的内存却会疯狂增长,当然是在没有设置 -Xmx 的前提下。

问题主题代码以被抽出,构成测试用例如下:


import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import javax.imageio.ImageIO;

public class ImageIOTest {

	public static void main(String[] args) throws Exception {
		int nums = 800;
		//for (int i = 0; i < nums; i++) {
			// new Thread(new Tt1()).run(); //单线程
		//}
		new Thread(new DoMutil(30, nums)).run(); // 并发
		Thread.sleep(1000000);
	}
}

class DoMutil implements Runnable {

	int threadNum = 1;
	int nums = 1;

	public DoMutil(int threadNum, int nums) {
		this.threadNum = threadNum;
		this.nums = nums;
	}

	@Override
	public void run() {
		ExecutorService executorService = Executors
				.newFixedThreadPool(threadNum);
		for (int i = 0; i < nums; i++) {
			executorService.execute(new Tt1());
		}
	}

}

class Tt1 implements Runnable {
	static String xx = "d:/x/xxx.png";

	public void run() {
		try {
			BufferedImage image = ImageIO.read(new File(xx));
			image.flush();
			int width = image.getWidth();
			Thread.sleep(100);
		} catch (IOException e1) {
		} catch (InterruptedException e) {
		}
	}
}
运行条件:1.   放个图片在 d:/x/xxx.png 。我的图片大小为600多k。

运行结果(win7 64位 jdk1.7.0_17): 1.单线程运行时,内存使用正常。 2. 30个并发执行时,内存使用近1G。
虽然这个1G的被jvm占用的内存,并非“使用的堆”大小,而是“堆”大小,但是机器的内存确实被用掉,影响了其他的系统。

经过各种分析。。。jvisualvm。。。gc日志。。。。均为发现任何问题。
-----------------------------------------------华丽分割--------------------------苦逼寻找-----------------------------------------

昨日,有人在办公群里问newWorkStealingPool 和newCachedThreadPool的区别,遂下载jdk1.8,把Executors源码给扫了,解释之。。
------------------------------转折点 如上-------------------------------

今日继续做测试,执行上述程序,无意间发现内存不再被使用这么多了,而是正常的270M左右。 
疑惑不解~ 
突然发现了这个


我X。。。jdk1.8.。。。

于是,又进行了多次测试,果然,jdk8是正常的,jdk7就是会吃掉很大内存。

-----------------------------结尾----------------------------
至此,基本上找到了根源。。。估计jdk7中,关于imageIO在线程池中并发使用时,会出现一些问题。当然了,问题就不深究了。
咱也没看过jvm源码。。。

PS: 这个问题,还没最终解决,因为还没上线到linux生产环境中,但是,这块应该还是存在问题的,所以,遇到该问题的小伙伴,可以参考下哈~哈哈
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值