JVM

95 阅读2分钟

第一节 垃圾回收

  1. 进程执行有多个线程,一个线程就会对应一个栈,栈里面存放的是一个个栈帧,一个栈帧对应一个方法。方法内部需要的变量和指令都存在栈帧里面。堆是线程之间共用的。

  2. 最难调试的bug:

    • 野指针,同一个对象,多个指针,一个释放了别的不知道还在用;同一个指针不同的位置。
    • 并发问题:多个线程访问一块内存
  3. 什么是垃圾:定位垃圾

    • 引用计数法:对象被引用时计数加一、被断开时减一、为零时说明没有被引用即可以清除。问题引用无法GC。
    • GC roots根可达:从root引用开始查找关联的都不是垃圾
  4. 清除算法:

    • 标记清除:标记成垃圾然后清楚,找垃圾的时候标记成垃圾清除,不好的地方是导致内存碎片化严重
    • 标记复制(拷贝):将内存分成大小相等的两块、一块存存数据、一块用于存放整理后的数据。用连续的内存把分散的整理好。浪费空间
    • 标记压缩(标记整理):边标记变整理,效率比较低。
  5. 分代收集算法:把内存划分为新生代,老年代。新生代存活率低使用标记复制算法,老年代存活率高可以使用标记清除和标记压缩。

    • 把堆分为新生代和老年代,新生代使用复制回收算法内存不是对半分是8:1:1,分别叫eden,s1,s2对象进来先到eden经历一次垃圾回收如果存活下来就放到s1,下一次eden和s1一起垃圾回收,如果还存活下来放到s2,然后下次eden和s2一起垃圾回收活下来就放在s1循环下去知道年龄达到老年代的要求放入老年代。(新生代满了会发生YGC,老年代满了就会发生FGC)
  6. 垃圾回收器:可以换进行调优

    • serial回收器分为:serial(新生代回收器),STW(stop the word)使用单线程停止所以进程进行清除 ;serial old(老年代回收器),单线程标记清除或者标记压缩
    • parallel回收器分为:parallel scavenge(ps):多线程STW;parallel old(po):多线程标记清除和标记压缩(1.8默认是ps+po)
    • concurrent GC并发的回收期(业务线程和回收线程并发进行):
    • ○CMS:并发标记清除作用在老年代

第二节 JVM

  1. JVM构成:
  • 每个线程独有的区域
    • 程序计数器
    • 本地方法栈
    • 虚拟机栈
  • 线程共有的区域
    • 方法区
    • 堆 若有收获,就点个赞吧