有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java内存泄漏

我正在创建一个持续运行的服务,每天在指定的时间运行程序的主体

基本上:

while(true){
run();
Thread.sleep(day);
}

过了一段时间,我开始摆脱记忆障碍。 读了一点之后,我想这是因为在run()方法中创建的任何对象都不会被垃圾收集

因此,我做了如下工作:

public void run(){
Object a = new Object();
a.doSomething();

a= null; //Wasn't here before
}

我的问题是,这能解决我的问题吗?我的印象是,一旦对象为null,它之前引用的对象将被垃圾收集?这也是个好主意吗?还是我应该考虑做点别的

谢谢


共 (6) 个答案

  1. # 1 楼答案

    不需要。您不需要将变量设置为null。VM知道您退出该作用域,并且变量a不再存在,因此它会自动减少引用计数,并且如果您的对象没有其他引用,则可以对其进行垃圾收集

    错误在别的地方

  2. # 2 楼答案

    添加a = null几乎肯定不足以解决问题(因为a无论如何都将超出范围)

    我的建议是使用内存探查器来查明泄漏的内容和位置

    我个人使用^{}。这很好,但是要花钱(你可以得到免费的评估)

    另一个最近发布的工具是^{}。我还没试过,但广告上说:

    Try out our Java agent for timely discovery of memory leaks. We'll tell you what is leaking, where the leak originates from and where the leaked objects currently reside - well before the OutOfMemoryError!

  3. # 3 楼答案

    将引用设置为null取决于对象是否仍在耗时较长的过程中的作用域中,尽管理论上它会将引用标记为null,但您无法保证它何时会被垃圾收集

    您需要检查您的对象是否位于代码中的某个长范围内

    找到了将引用设置为null的很好的解释:Does setting Java objects to null do anything anymore?

    为了解决您的问题,您需要分析您的应用程序

    搜索SO提供了很多关于垃圾收集的指针,因此我决定将搜索字符串放在这里:

    https://stackoverflow.com/search?q=Java+Garbage+collection+and+setting+references+to+null

    http://java.sun.com/docs/books/performance/1st_edition/html/JPAppGC.fm.html

  4. # 4 楼答案

    Local variables should be collected by GC. So, you don't need to put obj=null;. Because Object is also stored in Heap area.

  5. # 5 楼答案

    这可能确实有帮助,在某些情况下,GC算法需要一些帮助才能执行,但它不能保证解决您的问题,只能延迟它们

    我的忠告是: 以较短的时间段模拟相同的行为,以便强制发生错误。 使用探查器运行它,查看所有内存的去向,然后从那里开始工作

  6. # 6 楼答案

    你的印象不正确。如果在run()方法内创建的对象1)超出范围,2)释放了它们正在使用的任何本机或远程系统资源,则它们将被垃圾收集

    在run()方法调用中实际执行的功能是什么?您正在读取文件、进行数据库调用、写入套接字吗?如果不知道细节,很难提出更好的建议