假设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?
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*🎎
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. 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]; //
}
}
}
Baru-baru ini saya melihat dua artikel yang mungkin berguna kepada anda:
http://zhuanlan.51cto.com/art...
http://zhuanlan.51cto.com/art...