2009-12-09 61 views
0

Java垃圾收集器以优先级1运行,因此无法保证如果调用System.gc()将实际执行。是否可以更改垃圾收集器线程的优先级?

有什么方法可以改变它的优先级吗?如果我愿意,这将使我能够跑步。

+1

线程优先级真的是它可能无法运行的唯一原因吗? – 2009-12-09 17:24:11

+0

是的,我认为是。 – DKSRathore 2009-12-09 17:25:07

+2

你为什么要强迫它运行? – 2009-12-09 17:25:26

回答

6

垃圾收集器是一个独立的线程(由Tom Hawtin在注释中提醒,甚至不一定是单个线程),它的优先级由Java虚拟机决定。这意味着你不能强制垃圾收集。调用System.gc()告诉运行时环境“现在”可能是运行GC的好时机,但垃圾收集实际上不能保证立即完成。

+0

不错的简短事实。 – BalusC 2009-12-09 17:37:58

+4

它甚至不一定是一个单一的线程。 – 2009-12-09 17:38:49

+0

感谢您的满意答案帕斯卡尔。你只是为了点。 – DKSRathore 2009-12-09 17:42:44

4

即使您将线程优先级提高到 System.gc不保证任何内容。所有你可以确定的是,如果Java需要GC,它会引发内存不足异常。

+0

否这不是必需的。如果您已经调用System.gc,则在空闲时间运行。 – DKSRathore 2009-12-09 17:26:50

+0

因为如果是这样的话,所有未使用的对象都会留在JVM中很长一段时间,直到出现OOM条件?在我的系统上,它有8GB的JVM,它在达到6GB之后从未丰富7GB,当我的程序处于运行状态时,它将达到5GB,然后是6GB,等等。在你的情况下,它应该已经达到8GB,然后回到5 GB – DKSRathore 2009-12-09 17:31:57

+2

我不确定你的意思是什么。 Anyhoo - System.gc不能保证。完全一样。我不确定VM规格是否需要GC线程。只是Java在投掷OOM之前会给它一个很好的去处。 最后一点,Sun VM上的System.gc确实(或确实)完成了GC扫描,就在当前线程中。它不必这样做。它什么都不能做,仍然满足它的要求。 – 2009-12-09 17:34:55

0

创建线程时,它会继承创建线程的优先级。线程的优先级可以通过使用

public final void setPriority(int newPriority)

调整问题是一个线程不“跑”的垃圾收集器。 垃圾收集器由VM运行(当Java需要或处于“好心情:)”时)。

编辑: GC不是一个线程,而是一个运行时线程的方法。您可以更改运行时线程的优先级,但这不会影响GC。调用GC的线程是虚拟机的线程,超出了API的范围,因此您无法更改其优先级。

所以,我真的不认为你可以设置它的优先级。

+0

从gc的javadoc粘贴() gc代表“垃圾回收器”。即使未明确调用gc方法,虚拟机也会根据需要在单独的线程中自动执行此回收过程。 – DKSRathore 2009-12-09 17:33:39

+0

但是...取决于JVM实现,收集器可能使用多个线程,或者根本不使用线程。所以这个答案对我来说是正确的。 – 2009-12-09 17:45:07

1

GC将根据需要运行。你不需要手动调用它。如果你不喜欢什么时候运行,你可以用命令行参数来控制它。

如果您认为GC的行为有问题,您应该尝试修复原因而不是尝试编写自己的工作。

总之,你应该告诉我们你担心的真正原因是什么,所以我们可以解决这个问题。