我用Java编写了一个程序,它有5个线程。在run()中,我有一个while循环,它将循环遍历,这个循环将循环很多次。
当程序运行时,它正在逐渐吃ram,使程序爬行。无论如何我可以阻止它吃掉我所有的公羊吗?
修改
实际上只是考虑它,可能是因为循环创建了很多对象。我应该在while循环结束时将那些对象置空吗?
答案 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按钮。您现在可以看到您拥有的对象以及它们使用的内存量。按刷新以更新视图。