設計思路:把對象按照壽命長短來分組,分為年輕代和年老代,新創建的對象被分在年輕代,如果對象經過幾次回收後仍然存活,那麼再把這個對象劃分到年老代。年老代的收集頻率不像年輕代那麼頻繁,這樣就減少了每次垃圾回收時所要掃描的對象的數量,從而提高了垃圾回收效率。
把堆劃分為若干個子堆,每個堆對應一個年齡代:
JVM將整個堆劃分為Young區、Old區和Perm區,存放不同年齡的對象,這個三個區存放的對象有如下區別:
Young區:又分為Eden區和兩個Survivor區,其中所有新創建的對象都在Eden區,當Eden區滿後會觸發minor GC將Eden區仍然存活的對象復制到其中一個Survivor區中,另外一個Survivor區中的存活對象也復制到這個Survivor中,以保證始終有一個Survivor區是空的。
Old區:存放的是Young區的Survivor滿後觸發的minor GC後仍然存活的對象,當Eden區滿後會將對象存放到Survivor區中,如果Survivor區仍然存不下這些對象,GC收集器會將這些對象直接存到Old區,如果在Survivor區中的對象足夠老,也直接存放到Old區,如果Old區也滿了,將會觸發Full GC,回收整個堆內存。
Perm區:存放的主要是類的Class對象,Perm區的垃圾回收也是由Full GC觸發的。
參考:http://www.cnblogs.com/likehua/p/3369823.html,http://www.cnblogs.com/redcreen/archive/2011/05/04/2037057.html
最小內存值就是-Xms的值,即10240m
-Xmn 5120m:表示年輕代大小,-XXSurvivorRatio=3,即Eden:FromSurvivor:ToSurvivor=3:1:1;所以Survivor一共是10240*(2/5)=2048m。
A,Vector相當於一個線程安全的List B,HashMap是非線程安全的,其對應的線程安全類是HashTable C,Arraylist是非線程安全的,其對應的線程安全類是Vector D,StringBuffer是線程安全的,相當於一個線程安全的StringBuilder E,Properties實現了Map接口,是線程安全的
public class SortMap { public static void main(String[] args) { Map<String, Integer> map = new HashMap<String, Integer>(); map.put("1d", 4); map.put("2b", 3); map.put("3a", 1); map.put("4c", 2); System.out.println("原始數據:"); // 排序前 for(String s:map.keySet()) { System.out.println(s+":"+map.get(s)); } List<Map.Entry<String, Integer>> list = new ArrayList<Map.Entry<String, Integer>>(map.entrySet()); // 根據key值排序 Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() { @Override public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) { return o1.getKey().toString().compareTo(o2.toString()); } }); System.out.println("根據key值排序:"); // 根據key值排序後 for (Entry<String, Integer> entry : list) { System.out.println(entry.getKey() + ":" + entry.getValue()); } // 根據value排序 Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() { @Override public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) { return o1.getValue()-o2.getValue(); } }); System.out.println("根據value值排序:"); // 根據value值排序後 for (Entry<String, Integer> entry : list) { System.out.println(entry.getKey() + ":" + entry.getValue()); } } }