JVM内存模型
- 堆和方法区是线程间共享的
- 线程栈、本地方法栈和程序计数器是每个线程独享的
堆
- 分年轻代和老年代(默认配比1:2)
- 年轻代中分为伊甸园区和两个survivor区(默认配比8:1:1)
垃圾回收的大致过程:
- 一般分配的对象是在年轻代的伊甸园区
- 若运行过程中伊甸园区放满了,那么会触发Yong GC (minor GC),由字节码执行引擎开启一个垃圾收集线程
- GC过程,实际上是在找GC ROOT引用着的对象,如从栈中查找局部变量,从方法区中查找静态变量,从GC ROOT出发查找所有引用着的对象,直到找到最后一个对象,如果还是引用着的,那么即为非垃圾对象,将会移动到survivor区,并且该对象的分带年龄会+1;如果查找的过程没有引用着对象,那么就会被清理掉。
- 每次GC时,在伊甸园区的非垃圾对象会被移动到survivor区,而survivor区的对象若还是非垃圾对象,则分带年龄再+1,挪到另一个survivor区,如此反复,直到+到15后,将挪到老年区
- 如果老年区满了,就会触发full GC,会触发STW机制(stop the world),用户线程会被暂停,如网站会发生卡顿现象;并且full GC会回收整个堆和方法区,若经历过full GC后,老年代还是满的,那么就会抛出OOM异常
- 为什么要有STW机制?如果不暂停用户线程的话,那么用户线程会在垃圾收集的时候执行完毕,那么就会变成垃圾对象,而GC可能在之前已经检查过用户线程是非垃圾对象,导致用户线程在GC过程中变成垃圾对象就不会被回收
JVM设置 ‐Xss128k(默认1M)
-Xss设置越小count值越小,说明一个线程栈里能分配的栈帧就越少,但是对JVM整体来说能开启的线程数会更多
附:jvisualvm诊断工具教程