前提准备
- JVM
- GC垃圾回收
- JVM虚拟机监控调优和故障处理
- Tomcat和微服务优化
1、前提复习
1.1、JVM内存结构
1.1.1、
图中灰色部分为线程私有,几乎不存在垃圾回收
橙色部分线程共有,垃圾回收主要发生场所
- 类装载器子系统是什么?装载什么?有哪几种装载器
根启动类装载器:BootStrap
扩展类加载器:Extension
应用类加载器:AppClassloader
可以继承Classloader,自定义类加载器 - 双亲委派机制
- 类加载过程中的沙箱安全机制
1.1.2、java8以后的JVM
伊甸园区-幸存者1区-幸存者2区-养老区-(7以前是永久代)元空间
1.2、GC作用域
图中灰色部分为线程私有,几乎不存在垃圾回收
橙色部分线程共有,垃圾回收主要发生场所
1.3、常见垃圾回收算法
- 引用计数
有对象引用+1,没对象引用-1,到0为止说明需要回收。
缺点:天生的缺陷,较难实现循环引用的问题。
每次对对象复制时均需要维护引用计数器,且计数器本身也有一定的消耗。
所以JVM通常不采用这种方式。 - 复制————用于年轻代较多
在年轻代使用
复制之后,有交换,谁空谁是To。
幸存者0区,幸存者1区,在GC之后会互换,一个From,一个To。
优点:没有产生内存碎片,因为是整体复制。
缺点:有点浪费空间。尤其是大对象,复制起来有些耗时。
MinorGC
-
标记清除(MarkSweap)————用于老年代较多
先标记再清除。首先标记处要回收的对象,再统一回收这些对象。
优点:节约了空间
缺点:产生了内存碎片
- 标记(清除)整理————用于老年代较多
- 标记(Mark):与标记清除一样
-
压缩(Compact):再次扫描,并往一端滑动存活对象。
优点:既不浪费空间,也不会产生碎片
缺点:滑动存活对象会耗时间。
没有完美算法,具体哪一代用什么算法,分代收集