首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 开源软件 >

commons-io引起的ygc有关问题

2012-07-02 
commons-io引起的ygc问题今天接到任务,图片上传服务器的性能有问题,高峰期间YGC频率在2秒一次,维护应用的

commons-io引起的ygc问题
今天接到任务,图片上传服务器的性能有问题,高峰期间YGC频率在2秒一次,维护应用的程序员诊断的原因是图片处理API有性能问题。
不管咋样,亲自看一把才是王道,jmap -dump出堆内存文件。
用Eclipse MAT打开一看,发现FileCleaningTracker这个对象占用了将近一半的堆内存。
查看了下代码,发现这个类是commons-io下用于追踪文件的一个方法引起的问题。方法如下:

/**         * Run the reaper thread that will delete files as their associated         * marker objects are reclaimed by the garbage collector.         */        @Override        public void run() {            // thread exits when exitWhenFinished is true and there are no more tracked objects            while (exitWhenFinished == false || trackers.size() > 0) {                try {                    // Wait for a tracker to remove.                    Tracker tracker = (Tracker) q.remove(); // cannot return null                    trackers.remove(tracker);                    if (!tracker.delete()) {                        deleteFailures.add(tracker.getPath());                    }                    tracker.clear();                } catch (InterruptedException e) {                    continue;                }            }        }    }

只有当主线程手动调用exitWhenFinished方法的时候,这些Reaper线程才会进行清理动作。这样在图片上传高峰期将会在内存中积累很大的垃圾数据。

解决方案:
创建临时文件之后不调用该方法,写脚本事后进行删除工作。

热点排行