java - Peruntukan memori ArrayList, isu gc rujukan generasi silang
黄舟
黄舟 2017-05-17 10:07:27
0
1
911

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.

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

membalas semua(1)
小葫芦

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

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

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan