垃圾收集和交换、分页之间的关系



我是Java新手。我了解垃圾收集、分页和交换在隔离状态下的作用。我想了解他们之间的关系。GC是否导致分页或交换?我知道GC的主要工作是回收内存。但是,如果需要,它是通过分页或交换进行回收,还是与GC无关,由操作系统完成?

要理解这种关系,请注意Java执行代垃圾收集。堆上分配了新一代和老一代的对象。从JVM的角度来看,它不关心交换,而是使用配置时的堆大小。然而,堆大小当然会决定管理JVM进程的操作系统的交换行为。

在年轻一代的收藏中,只收集了相当新的物品。这些对象不应该因为最近的分配而被操作系统交换掉。当然,如果你为年轻一代选择了比RAM大的大小,即使是收集年轻一代,也需要进行交换,这会减慢垃圾收集器的速度。

在终身制生成中,垃圾收集的性能首先取决于收集策略。考虑一个执行完全垃圾收集的天真算法。该算法必须检查整个应用程序的对象图,哪些对象图需要访问整个JVM堆。显然,整个堆应该适合RAM。否则,垃圾收集将需要大量的交换,这将导致糟糕的性能。实际上,收集器不会检查整个对象图。然而,在配置Java应用程序的生产服务器时,选择适合RAM的堆大小以避免过度交换仍然是一种很好的做法。

实际上,我也是Java世界的新手。我来这里是因为我和你一样对此感到困惑。但是,如果您考虑交换的机制,您可能会发现交换和垃圾收集之间的区别。交换是操作系统的一种行为。垃圾回收是Java jvm的一种行为,Java jvm是系统的进程/线程。所以,交换和垃圾回收是不同层次的事情。如果内存不足,则会进行交换,找出未使用的临时内存,然后进行交换。

最重要的是,交换可能在完全GC之前发生。同时进行垃圾回收,即全gc。也可能在不交换的情况下发生。一个简单的例子是:我们用一个小堆大小来配置JVM。bug我们分配了一个很大的缓冲空间,在这种情况下,可能会发生完全GC,也可能发生OOM。

最新更新