我有一个小型测试程序,其中一些自定义对象被放入集合中。
自定义对象持有Executors.newSingleThreadScheduledExecutor()
成员,该成员初始化scheduleAtFixedRate(<some quick task>, ...<every 1 min or so>)
。换句话说,集合中的每个自定义对象都拥有自己的执行程序和预定的未来:
class A {
private ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
private ScheduledFuture reoccurringTask = scheduler.scheduleAtFixedRate(
() -> <some quick calc>,
1L, 1L, TimeUnit.MINUTES);
}
class B {
List<A> list = new ArrayList<>(){{add(new A()); add(new A());}};
// at some point
list.remove(0);
// In which case is the removed A object eligible for GC? (see questions below)
}
现在在某种程度上基于某种逻辑,某些自定义对象的ScheduledFuture
被取消,但执行者的shutdown
方法没有被调用,只是它的预定工作完成了。< / p>
如果我现在清除整个集合,将其指定为null等。我不确定它是如何关于我的自定义对象的gc资格:
自定义对象,其预定的未来仍处于活动状态(之前未取消)不符合gc条件,因为执行程序是独立运行的,尽管从任何地方都没有对自定义对象的引用,或者是错的?
自定义对象(其预定的未来处于非活动状态(之前已取消))可能符合gc的条件,因为自任何地方都没有对自定义对象的引用,并且计划任务处于非活动状态,尽管执行程序未被关闭,或者这是错的?
所有自定义对象及其成员(执行者和预定期货)都有资格获得gc?
很高兴得到一些简短的解释。我试图运行gc,希望看到哪些对象将被删除,但gc似乎没有删除任何东西,可能是因为测试程序太小,gc不想启动:) 我尝试使用Eclipse MAT,但找不到合适的方法来确定哪个对象符合gc条件。是否只是想检查有资格获得gc的对象的转储?