JVM內存結構

image.png

image.png
每起一個線程,都會在棧內存中開辟一塊專屬于該線程的空間,該線程每調用一個方法就會啟動一個棧幀
方法區(qū)在JDK8中改名叫永久區(qū),存放Class文件,靜態(tài)變量,常量,常量池等。
堆內存

image.png
大小比例: eden:s1:s2 = 8:1:1 ,new:old = 1:3 或者 3: 8
這些比例可以配置的
- 新創(chuàng)建(new)的對象如果特別大,則直接放入老年代區(qū)(tenured),否則放入eden區(qū)
- 當進行gc時,將eden區(qū)和s1中的垃圾清理后,將s1整個復制到s2中,eden區(qū)存活的對象也復制到s2;下次gc時進行清理后,將s2整個復制到s1,并且eden區(qū)存活的對象復制到s2,如此反復
- 若有對象一直在s1和s2中反復移動,到達一定次數后,則從新生代移動到老年代
對象的分配

image.png
對象分配的過程:
- 創(chuàng)建對象時,若對象很小,則直接在分配在線程的??臻g的棧幀中(方法調用),好處是當方法結束或線程結束,則對象的內存可直接回收,不需要垃圾收集器進行回收
- 若線程棧幀中分配不下,則會在線程本地緩存分配,即TLAB
- 若線程本地緩存放不下,且對象特別大,則放入老年代,否則放入eden區(qū)
垃圾

image.png
Java采用正向可達的算法

image.png

image.png

image.png

image.png

image.png
新生代采用復制算法:存活對象少,效率高
老年代采用標記壓縮算法:
- 每次gc時產生的垃圾比較少
- 標記壓縮后,保證沒有內存碎片,可以存放大對象
JVM參數

image.png

image.png

image.png

image.png

image.png
垃圾收集器

image.png
- Serial Collector 一般不用
- Parallel Collector JDK8默認的收集器,多處理器并行進行垃圾回收,但是停頓時間長,可能會達到1秒或更長, -XX:+UseParallelGC
- CMS Collector 采用并發(fā)進行垃圾回收,響應快,停頓時間短,-XX:UseConMarkSweepGC
- G1 采用并發(fā)進行垃圾回收,響應快,不僅停頓時間短,并發(fā)大,停頓時間比CMS略長,-XX:UseG1GC