Jvm 堆內存內部結構
所有通過new創建的對象的內存都在堆中分配,其大小可以通過-Xmx和-Xms來控制。堆被划分為新生代和老年代,新生代又被進一步划分為Eden(伊甸園)和Survivor(幸存者)區,老年代,在后面不是堆區是永恆代(方法區),為了進一步了解堆內存里的結構,我們先看看后面要講的一種垃圾回收算法,分代算法,回收垃圾的過程,通過這個過程的分析,進一步了解堆區里的結構細節,結構圖如下所示:
當幸存對象的年齡到達某個值后,就會從年輕代進入老年代。
最后的永恆代,放常用庫文件和方法。
Eden和survivor的比例為8:1,年輕代中的對象基本都是朝生夕死的(80%以上),老年代比年輕代內存大。如果老年代內存滿了,就會觸發major GC或者full GC。觸發full GC就會出現所謂的STW(stop the world)現象。即所有的進程都掛起等待清理垃圾。
major GC是回收老年代的垃圾。Full GC是回收老年代和年輕代的垃圾。
JVM的垃圾回收器判定是否是垃圾數據的一般方法:
許多Java的垃圾收集器都使用了引用的根集GC Roots,作為分析對象存活與否的依據。引用的根集是正在執行的Java程序隨時都可以訪問引用的變量的集合——也就是存在堆棧或是靜態存儲空間上的引用變量。從這些根集變量出發可直接或是間接到達的對象,垃圾收集器會認為這些對象是生命尚存的對象;相對的從這些根集變量出發通過任意途徑都無法到達的對象,就是死亡的,它們就會成為下一次垃圾收集的對象。