Rumah  >  Soal Jawab  >  teks badan

java - Peruntukan memori ArrayList, isu gc rujukan generasi silang

Apakah peruntukan memori ArrayList dalam JVM?

假设List<BigObject> list = new ArrayList<>(); 

private static class BigObject{
        private byte[] foo;

        BigObject(){
            foo = new byte[20 * 1024];
        }
    }

Tambah BigObject secara berterusan, Adakah hubungan rujukan seperti berikut?

Kemudian ygc berlaku Adakah BigObject memasuki kawasan lama Jika objek arrayList tidak memasuki kawasan lama, bukankah terdapat rujukan generasi silang? Jika ia masuk, maka obj = new BigObject() diperuntukkan dalam generasi baharu selepas ygc, dan kemudian list.add(obj), tidakkah terdapat rujukan kepada kawasan lama->muda Apakah peruntukan memori? suka?

Asal masalah

Jalankan kod berikut:
Parameter: /jdk1.7.0_79.jdk/bin/java -Xmx500M -Xms500M -Xmn200M -XX:+UseConcMarkSweepGC -XX:+UseCMSIinitiatingOccupancyOnly -XX:CMpConcurcyOnly -XX:CMpCurapan rentTime -XX : +PrintGCApplicationStoppedTime -XX:+PrintHeapAtGC -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -XX:+PrintGCDateStamps -verbose:gc -XX:+PrintGCDetails -Xloggc:/Users/.log*🎎

import java.util.ArrayList;
import java.util.List;

/**
 * @author ***
 * @time 2017-04-19-11:14
 */
public class CrossReference {
    private static int unit = 20 * 1024;

    public static void main(String[] args) {
        allocate();

        try {
            Thread.sleep(1000);
            System.out.println("allocate end************");
            Thread.sleep(100000);
        } catch (Exception e){
            e.printStackTrace();
        }
    }

    private static void allocate(){
        List<BigObject> list = new ArrayList<>();
        int size = 1024 * 1024 * 400;
        int len = size / unit;

        for( int i = 0; i < len; i++){

            BigObject bigObject = new BigObject();
            list.add(bigObject);
        }
    }

    private static class BigObject{
        private byte[] foo;

        BigObject(){
            foo = new byte[unit]; //
        }
    }


}
Melihat gc.log, ia akan kelihatan bahawa selepas melaksanakan kaedah allocate(), kawasan lama masih diduduki lebih daripada 90%, dan CMS GC dijalankan secara berterusan tetapi tidak boleh dikitar semula.

黄舟黄舟2712 hari yang lalu851

membalas semua(1)saya akan balas

  • 高洛峰

    高洛峰2017-05-17 10:09:27

    Baru-baru ini saya melihat dua artikel yang mungkin berguna kepada anda:

    http://zhuanlan.51cto.com/art...
    http://zhuanlan.51cto.com/art...

    balas
    0
  • Batalbalas