Java在线程中循环

时间:2010-07-02 13:06:34

标签: java multithreading while-loop

我用Java编写了一个程序,它有5个线程。在run()中,我有一个while循环,它将循环遍历,这个循环将循环很多次。

当程序运行时,它正在逐渐吃ram,使程序爬行。无论如何我可以阻止它吃掉我所有的公羊吗?

修改
实际上只是考虑它,可能是因为循环创建了很多对象。我应该在while循环结束时将那些对象置空吗?

5 个答案:

答案 0 :(得分:8)

如果您正在创建新对象并将其保存在循环中的某个集合中,那么很容易很快填满内存。

您需要做的是确保不保存任何您不需要的额外物品。

此外,您应该优化线程中的逻辑以消耗最少的内存。

答案 1 :(得分:3)

  

程序运行时,它是   逐渐吃着公羊带来的   程序爬行。无论如何我有   可以阻止它吃掉我所有的公羊?

不确定。更改您的代码,以便它使用更少的RAM。

答案 2 :(得分:1)

具体到@Michael Borgwardt的答案,尽量减少新对象的创建。如果你每次都可以重复使用同一个对象而不是创建新对象,那么你可以在那里节省一些内存。

但正如其他人所说,如果没有看到你的代码,我们只是在猜测。

答案 3 :(得分:1)

你的每个线程都有一个无限while循环是正常的,但只是让while循环不会消耗更多的RAM。

new Thread(new Runnable() {
    public void run() {
        try {
            while (true) {
                // do some work
            }
        } catch(InterruptedException ex) {}
    }
}).start();

您正在做一些消耗RAM的事情,因此您必须调试应用程序并找出RAM使用量增加的原因。

更新

您不必在循环结束时创建对象null ...如果您没有持有这些对象的引用,那么垃圾收集器应该清理它们。在创建对象后,您对这些对象做了什么?你用了多少RAM?

答案 4 :(得分:1)

您可能需要一个内存分析器来了解什么是“吃RAM”。有很多工具可用。一个商业工具是JProfiler

一个简单而免费的工具是使用随Java VisualVM提供的Sun Profiler。如果安装了JDK 6,则可能已在计算机上安装了此程序。运行C:\ Program Files \ Java \ jdk1.6.0_16 \ bin \ jvisualvm.exe。连接到正在运行的Java进程,然后按Profiler选项卡和Memory按钮。您现在可以看到您拥有的对象以及它们使用的内存量。按刷新以更新视图。

相关问题