美文网首页
JVM-007-JVM调优之基础理论

JVM-007-JVM调优之基础理论

作者: Docker_Compose | 来源:发表于2020-11-16 23:02 被阅读0次

    一、认识Garbage

     Garbage,垃圾。
     Java回收垃圾的方式是采用垃圾回收器。那么什么是垃圾?
     简单的来说,没有任何引用指向的对象就是垃圾。




    二、Java VS C++ 的垃圾回收

    类别 \ 语言 |Java | C++
    ---- | ---- | ---- | ----
    回收方式 | GC回收垃圾 | 手工回收
    垃圾回收问题 | 自动回收 | 忘记回收(内存泄漏)、回收多次(非法访问)
    开发效率 | 高 | 低
    执行效率 | 低 | 高




    三、如何定位垃圾

      定位垃圾有两种算法,一种是Reference Conunt,另一种Root Searching



    1、Reference Conunt

      Reference Conunt算法最大的问题是不能解决循环引用,如A->B->C->A



    2、Root Searching

    GC Roots.png

    如何清除

      找不到root的对象都清除


    什么是Roots
    1. JVM Stack
    2. native method stack
    3. runtime constant pool
    4. static references in method area
    5. Clazz




    四、GC的常用算法

    类目\ 算法 Mark Sweep Copying Mark Compact
    原理 找到有用的,没用的全部标出来 内存一分为二,把有用的拷贝到一边,另一边全部清掉 一边清除垃圾,一边移动及复制对象
    适用场景 存活对象多,效率较高 存活对象少 存活对象少
    缺点 两遍扫描(一遍标记,二遍清除),执行效率低,容易碎片 浪费空间 执行效率低下
    优点 算法简单 不会产生碎片 不会产生碎片,不浪费空间




    五、堆内存的逻辑分区

    类目 \ 分区 Yong Old
    分区 eden:survivor:survivor =8:1:1 tenured
    回收算法 copying mark sweep/mark compact
    GC回收名称 YGC/Minor GC FGC/Major GC
    触发GC的条件 Yong 区满了,无可分配空间 Old区满了,无可分配空间。FGC 会同时触发Yong 区和Old区的GC



    1、对象从Yong区进入Old区的过程

    1. YGC回收之后,大多数的对象会被回收,活着的进入s0
    2. 再次YGC,活着的对象eden + s0 -> s1
    3. 再次YGC,eden + s1 -> s0
    4. 年龄足够 -> 老年代 (其他GC:15;CMS:6)
    5. survivor区装不下 -> 老年代



    2、动态年龄

      当survivor1的存活对象移动到survivor2,并且存活数量超过survivor2容量的50%,那么survivor2就会把年龄最大对象的放在Old区



    3、分配担保

      YGC期间,survivor 区空间不够了 ,空间担保直接进入老年代



    4、小知识

      指定Yong 区大小:-Xmn,指定Heap区大小:-Xms,-Xmx




    栈上分配 与 TLAB

    栈上分配

    • 线程私有小对象
    • 无逃逸
    • 支持标量替换:class对象 向 int m转换,无需整个class对象
    • 无需调整

    TLAB

     TLAB,即线程本地分配

    • 占用eden,默认1%
    • 小对象
    • 多线程的时候不用竞争eden就可以申请内存,提供效率
    • 无需调整

    相关文章

      网友评论

          本文标题:JVM-007-JVM调优之基础理论

          本文链接:https://www.haomeiwen.com/subject/nmsgbktx.html