【问题标题】:For an auto scheduled app in Java, which way is better?对于 Java 中的自动计划应用程序,哪种方式更好?
【发布时间】:2014-02-23 23:58:40
【问题描述】:

我问了一个问题:Any practical difference in the use of Java's static method main?

但是没有完全得到答案,所以我想换一种说法,看看这次问题是否更清楚:

我有一个带有静态主方法的 A 类:

public class Class_A
{
  ...

  public static void main(String[] args) 
  {
   ...
  }
}

我还有一个 B 类,它在后台每天 24 小时不间断运行,并且每小时都会自动启动 Class_A。 Class_A 使用了大量的内存并且体积非常大,所以当它完成后,我希望所有的内存都被回收,我正在尽我的一份力量来确保它发生,但有时在程序的某个地方可能会出现内存泄漏,那么 Class_B 调用会更好吗:

new Class_A().main(new String[]{});

所以它的内存在它完成后会更好地回收? 还是调用: Class_A.main(new String[]{}) 更好?

【问题讨论】:

  • 从静态上下文中调用它。
  • 其实我看不出有什么不同。如果在静态 main 方法中分配了很多对象并且有内存泄漏,无论如何它都会泄漏。我认为唯一不干扰的方法是在另一个 JVM 中调用 Class_A

标签: java memory static


【解决方案1】:

这不会有帮助。 即使您删除所有 Class 实例并调用垃圾收集器,JVM 也会保留内存。 解决这个问题的简单方法是使用第二个 JVM 实例。或者只是将调用部分放在 cron 或其他东西中。

【讨论】:

【解决方案2】:
new Class_A().main(new String[]{});

其实是

{    // a scope for the new object
     Class_A immediatelyFreeForGC = new Class_A();
}
Class_A.main(new String[]{});

您创建的对象不会改变任何东西(除非它的构造函数有副作用),因为无论您如何编写静态方法,它总是被静态调用。

你甚至可以做

 Class_A classA = null;
 classA.main();

不会有NullPointerException,因为classA引用的对象被完全忽略了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-12
    • 1970-01-01
    • 2019-08-25
    • 2012-08-02
    相关资源
    最近更新 更多