我是Java的新手。我理解垃圾收集和分页,交换是孤立的。我想了解它们之间的关系。 GC是否会导致分页或交换?我知道GC的主要工作是回收内存。但是,如果需要,它是通过分页还是交换来回收,还是与GC无关并且由操作系统完成?
答案 0 :(得分:1)
要理解这种关系,请注意Java执行generational garbage collection。在堆上分配了一个年轻和老一代的对象。从JVM的角度来看,它不关心交换,而是使用它配置的堆大小。但是,堆大小当然会决定管理JVM进程的操作系统的交换行为。
在年轻一代的收藏中,只收集了新的物品。由于最近的分配,操作系统不应该交换这些对象。当然,如果你为年轻一代选择了比你的RAM更大的尺寸,即使收集年轻一代,也需要进行交换,这会减慢垃圾收集器的速度。
在终身一代中,垃圾收集的性能首先取决于收集策略。考虑一个执行完整垃圾收集的天真算法。该算法必须检查整个应用程序的对象图,这需要访问整个JVM堆。显然,整个堆应该适合RAM。否则,垃圾收集需要进行大量交换,否则会导致性能下降。实际上,收集器不会检查整个对象图。但是,选择适合RAM的堆大小仍然是一种很好的做法,以避免在配置Java应用程序的生产服务器时进行过多的交换。
答案 1 :(得分:0)
实际上,我也是Java世界的新手。我来这里是因为我和你一样感到困惑。但是,如果您考虑交换机制,您可能会发现交换和垃圾收集之间的区别。交换是操作员系统的行为。和垃圾收集是Java jvm的行为,它是系统的进程/线程。 因此,交换和垃圾收集是不同层次的事情。如果内存不足,则会发生交换以找出未使用的内存,然后交换掉。
最重要的是,在完全GC之前可能会发生交换。同时,垃圾收集即全gc。也可能在没有交换的情况下发生。一个简单的例子是:我们使用较小的堆大小配置JVM。我们分配一个大的缓冲区空间,在这种情况下,可能会发生完整的GC,也可能发生OOM。