JVM-整体结构深度解析

  作者:图灵javaer


在线预览


JVM内存模型



  • 堆和方法区是线程间共享的
  • 线程栈、本地方法栈和程序计数器是每个线程独享的



  • 分年轻代和老年代(默认配比1:2)
  • 年轻代中分为伊甸园区和两个survivor区(默认配比8:1:1)


垃圾回收的大致过程:


  1. 一般分配的对象是在年轻代的伊甸园区
  2. 若运行过程中伊甸园区放满了,那么会触发Yong GC (minor GC),由字节码执行引擎开启一个垃圾收集线程
  3. GC过程,实际上是在找GC ROOT引用着的对象,如从中查找局部变量,从方法区中查找静态变量,从GC ROOT出发查找所有引用着的对象,直到找到最后一个对象,如果还是引用着的,那么即为非垃圾对象将会移动到survivor区,并且该对象的分带年龄会+1;如果查找的过程没有引用着对象,那么就会被清理掉。
  4. 每次GC时,在伊甸园区的非垃圾对象会被移动到survivor区,而survivor区的对象若还是非垃圾对象则分带年龄再+1,挪到另一个survivor区,如此反复,直到+到15后,将挪到老年区
  5. 如果老年区满了,就会触发full GC,会触发STW机制(stop the world),用户线程会被暂停,如网站会发生卡顿现象;并且full GC会回收整个方法区,若经历过full GC后,老年代还是满的,那么就会抛出OOM异常
  6. 为什么要有STW机制?如果不暂停用户线程的话,那么用户线程会在垃圾收集的时候执行完毕,那么就会变成垃圾对象,而GC可能在之前已经检查过用户线程是非垃圾对象,导致用户线程在GC过程中变成垃圾对象就不会被回收


JVM设置  ‐Xss128k(默认1M)


-Xss设置越小count值越小,说明一个线程栈里能分配的栈帧就越少,但是对JVM整体来说能开启的线程数会更多


附:jvisualvm诊断工具教程


在线预览


相关推荐

评论 抢沙发

表情

分类选择