在循环中创建java对象而不会发生内存泄漏

时间:2016-03-14 16:54:17

标签: java memory-leaks

func changeImage1() {
    self.view.backgroundColor = UIColor.clearColor()  //show UIWindow

    UIView.animateWithDuration(2, delay: 0, options: UIViewAnimationOptions.CurveEaseInOut, animations: {
        if let window = UIApplication.sharedApplication().windows.first as UIWindow! {
            window.backgroundColor = UIColor(patternImage: UIImage(named: "myImage1")!) //Animation OK
        }
        }, completion: nil)
    }

func changeImage2() {
    UIView.animateWithDuration(2, delay: 0, options: UIViewAnimationOptions.CurveEaseInOut, animations: {
        if let window = UIApplication.sharedApplication().windows.first as UIWindow! {
            window.backgroundColor = UIColor(patternImage: UIImage(named: "myImage2")!) //NO animation
        }
        }, completion: nil)
    }

这是一个随机函数,需要100x100的屏幕截图并一遍又一遍地将其保存到文件中。现在我的问题是,当我打开任务管理器时,这个程序使用的内存是永远增加。但是,当我查看JProfiler中的内存选项卡时,它显示垃圾收集器启动并在某个时刻删除所有对象。是我的任务经理"撒谎"或者如何创建一个可以运行数小时而不分配计算机中所有内存的简单程序。我也从命令行运行它,结果相同。如果没有"写入文件",结果仍然相同。

2 个答案:

答案 0 :(得分:0)

这可能是由于没有关闭你的作家。尝试添加

file1.close();
buff1.close();
在你的memLeak方法结束时

答案 1 :(得分:0)

一般来说,Java是一种垃圾收集语言,这意味着在执行一个或多个收集周期之前,内存实际上并未发布。这导致您看到内存使用量稳定增加的行为,直到某个阈值通过,然后急剧下降,只是为了启动流程。

解决此问题的一种方法是告诉(提示)运行时现在通过System.gc();调用执行垃圾收集。请注意,这是一个提示,并没有实际强制垃圾收集周期。

    while (true) {
        memLeak();
        System.gc();
        Thread.sleep(1000);
    }