高分求教函数吃内存的问题,帮顶有分,在线等

时间:2021-06-20 21:31:13
各位大虾

小弟遇到了一个奇怪的问题
在处理png图片的时候
我用到了ImageConsumer中的setPixels和imageComplete等相关的函数。
我的png图片每个大概4-5k

但是当程序每次运行到setPixels函数的时候都会让applet所占内存增长3-4m左右
而且每次运行到imageComplete函数的时候又会增长5m左右的内存。


这样下去没过几次内存就溢出了。

求教各位大虾,原因为何?

万分感谢。在线求解!

8 个解决方案

#1


学习,帮顶。

#2


图片计算插值是比较费内存的,唯一的做法就是用完这个Image对象之后及时释放掉。

#3


UP

#4


引用 2 楼 nine_suns99 的回复:
图片计算插值是比较费内存的,唯一的做法就是用完这个Image对象之后及时释放掉。

我觉得这就是问题所在,要像黑瞎子掰棒子一样释放内存。

#5


可是我在 ic.imageComplete(error ? 1 : 3); 之后尝试释放内存了
但是没有效果~
removeConsumer(ic);
theConsumers.removeElement(ic);
ic = null;
System.gc();

请指教!
万分感谢~!

#6


可是我在 ic.imageComplete(error ? 1 : 3); 之后尝试释放内存了 
但是没有效果~ 
removeConsumer(ic); 
theConsumers.removeElement(ic); 
ic = null; 
System.gc(); 

请指教! 
万分感谢~!

#7


System.gc();
只是申请回收,GC未必真会去管你,如果他认为值得回收才会去弄;

#8


尝试用一些软引用,这样堆栈溢出前就会由GC回收,或者是用虚引用,这样运行GC就会回收。自己做选择好了。

#1


学习,帮顶。

#2


图片计算插值是比较费内存的,唯一的做法就是用完这个Image对象之后及时释放掉。

#3


UP

#4


引用 2 楼 nine_suns99 的回复:
图片计算插值是比较费内存的,唯一的做法就是用完这个Image对象之后及时释放掉。

我觉得这就是问题所在,要像黑瞎子掰棒子一样释放内存。

#5


可是我在 ic.imageComplete(error ? 1 : 3); 之后尝试释放内存了
但是没有效果~
removeConsumer(ic);
theConsumers.removeElement(ic);
ic = null;
System.gc();

请指教!
万分感谢~!

#6


可是我在 ic.imageComplete(error ? 1 : 3); 之后尝试释放内存了 
但是没有效果~ 
removeConsumer(ic); 
theConsumers.removeElement(ic); 
ic = null; 
System.gc(); 

请指教! 
万分感谢~!

#7


System.gc();
只是申请回收,GC未必真会去管你,如果他认为值得回收才会去弄;

#8


尝试用一些软引用,这样堆栈溢出前就会由GC回收,或者是用虚引用,这样运行GC就会回收。自己做选择好了。