public class ModelJedaGC {

    public static void main(String[] args) {
        // Model biaya: satu unit = waktu memproses satu objek oleh GC.
        int objekPerSiklus = 240;   // objek sementara yang dialokasikan tiap siklus
        int rasioBertahan = 5;      // persen objek muda yang masih hidup saat koleksi
        int objekTuaAwal = 40;      // objek lama yang hidup stabil di generasi tua
        int biayaTetap = 2;         // unit tetap per kejadian koleksi
        int jumlahSiklus = 6;

        int objekTua = objekTuaAwal;
        int totalGenerasional = 0;
        int totalSeluruh = 0;

        System.out.println("Model jeda GC: " + jumlahSiklus + " siklus, "
                + objekPerSiklus + " objek/siklus, " + rasioBertahan + "% bertahan");
        System.out.println();
        System.out.println("siklus  objekTua  jedaGenerasional  jedaSeluruhHeap");

        for (int siklus = 1; siklus <= jumlahSiklus; siklus++) {
            int bertahan = objekPerSiklus * rasioBertahan / 100;
            int jedaGenerasional = biayaTetap + bertahan;
            int jedaSeluruhHeap = biayaTetap + bertahan + objekTua;

            totalGenerasional += jedaGenerasional;
            totalSeluruh += jedaSeluruhHeap;

            System.out.printf("%4d%12d%16d%16d%n", siklus, objekTua,
                    jedaGenerasional, jedaSeluruhHeap);

            // Survivor dipromosikan ke generasi tua pada siklus berikutnya.
            objekTua += bertahan;
        }

        System.out.println();
        System.out.println("Total jeda generasional : " + totalGenerasional + " unit");
        System.out.println("Total jeda seluruh heap : " + totalSeluruh + " unit");
        System.out.println("Perbandingan jeda       : "
                + String.format("%.1f kali", totalSeluruh / (double) totalGenerasional));
    }
}
