Jaka jest różnica między metodami System.gc() i Runtime.gc() w Javie?

Java jest językiem programowania, który posiada wbudowany mechanizm zarządzania pamięcią, znany jako Garbage Collector (GC). GC automatycznie zwalnia pamięć, która nie jest już używana. Jednak w pewnych sytuacjach programiści chcą ręcznie sugerować uruchomienie procesu zbierania śmieci. Do tego celu w Javie dostępne są dwie metody: System.gc() oraz Runtime.gc(). Oba te wywołania mają na celu sugestię dla maszyny wirtualnej Java (JVM) do przeprowadzenia garbage collection, jednak ich implementacja i zastosowanie są identyczne. To, co różni te metody, to głównie kontekst ich użycia.

Rozbudowany przykład kodu

Poniżej znajduje się przykład użycia obu metod. Przykład ten ilustruje, jak można zasugerować JVM wykonanie garbage collection, jednak należy pamiętać, że żadna z tych metod nie gwarantuje natychmiastowego uruchomienia GC.

public class GCDemo {
    // Metoda main - punkt startowy programu
    public static void main(String[] args) {
        // Tworzenie nowych obiektów
        Runtime runtime = Runtime.getRuntime();
        System.out.println("Total memory before: " + runtime.totalMemory());

        // Wywołanie GC za pomocą System.gc()
        System.out.println("Requesting GC using System.gc()");
        System.gc();

        // Czekanie na zakończenie garbage collection
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }

        System.out.println("Total memory after System.gc(): " + runtime.totalMemory());

        // Przygotowanie do kolejnego przykładu
        System.out.println("Preparing for Runtime.gc() example");

        // Wywołanie GC za pomocą Runtime.gc()
        System.out.println("Requesting GC using Runtime.gc()");
        runtime.gc();

        // Czekanie na zakończenie garbage collection
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }

        // Sprawdzenie pamięci po Runtime.gc()
        System.out.println("Total memory after Runtime.gc(): " + runtime.totalMemory());
    }
}

W powyższym kodzie:

  • Runtime.getRuntime() zwraca instancję klasy Runtime związaną z bieżącym programem Java.
  • System.gc() i Runtime.gc() są wywołane w celu sugerowania JVM, aby przeprowadziło garbage collection.
  • Thread.sleep(1000) jest używane do zatrzymania programu na chwilę, aby dać czas na zakończenie procesu garbage collection.

Podsumowanie

Metody System.gc() i Runtime.gc() w Javie służą do sugerowania maszynie wirtualnej, by przeprowadziła proces garbage collection. Obydwie metody działają w bardzo podobny sposób, różnica tkwi głównie w sposobie dostępu do nich — System.gc() jest metodą statyczną klasy System, podczas gdy Runtime.gc() wywoływane jest na instancji klasy Runtime. W praktyce wybór między tymi metodami zależy od preferencji programisty i specyfikacji projektu. Ważne jest jednak, aby pamiętać, że te metody jedynie sugerują wykonanie garbage collection, a decyzja o jego przeprowadzeniu zawsze należy do JVM.

Jeżeli chcesz przyśpieszyć swoją naukę tworzenia stron chciałbym polecić mój kurs video Java w którym nauczysz się tego języka od podstaw do zaawansowanych jego  aspektów.

Scroll to Top