第一节 垃圾回收
-
进程执行有多个线程,一个线程就会对应一个栈,栈里面存放的是一个个栈帧,一个栈帧对应一个方法。方法内部需要的变量和指令都存在栈帧里面。堆是线程之间共用的。
-
最难调试的bug:
- 野指针,同一个对象,多个指针,一个释放了别的不知道还在用;同一个指针不同的位置。
- 并发问题:多个线程访问一块内存
-
什么是垃圾:定位垃圾
- 引用计数法:对象被引用时计数加一、被断开时减一、为零时说明没有被引用即可以清除。问题引用无法GC。
- GC roots根可达:从root引用开始查找关联的都不是垃圾
-
清除算法:
- 标记清除:标记成垃圾然后清楚,找垃圾的时候标记成垃圾清除,不好的地方是导致内存碎片化严重
- 标记复制(拷贝):将内存分成大小相等的两块、一块存存数据、一块用于存放整理后的数据。用连续的内存把分散的整理好。浪费空间
- 标记压缩(标记整理):边标记变整理,效率比较低。
-
分代收集算法:把内存划分为新生代,老年代。新生代存活率低使用标记复制算法,老年代存活率高可以使用标记清除和标记压缩。
- 把堆分为新生代和老年代,新生代使用复制回收算法内存不是对半分是8:1:1,分别叫eden,s1,s2对象进来先到eden经历一次垃圾回收如果存活下来就放到s1,下一次eden和s1一起垃圾回收,如果还存活下来放到s2,然后下次eden和s2一起垃圾回收活下来就放在s1循环下去知道年龄达到老年代的要求放入老年代。(新生代满了会发生YGC,老年代满了就会发生FGC)
-
垃圾回收器:可以换进行调优
- serial回收器分为:serial(新生代回收器),STW(stop the word)使用单线程停止所以进程进行清除 ;serial old(老年代回收器),单线程标记清除或者标记压缩
- parallel回收器分为:parallel scavenge(ps):多线程STW;parallel old(po):多线程标记清除和标记压缩(1.8默认是ps+po)
- concurrent GC并发的回收期(业务线程和回收线程并发进行):
- ○CMS:并发标记清除作用在老年代
第二节 JVM
- JVM构成:
- 每个线程独有的区域
- 程序计数器
- 本地方法栈
- 虚拟机栈
- 线程共有的区域
- 方法区
- 堆 若有收获,就点个赞吧