JVM-007-JVM调优之基础理论
2020-11-16 本文已影响0人
Docker_Compose
一、认识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
- JVM Stack
- native method stack
- runtime constant pool
- static references in method area
- 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区的过程
- YGC回收之后,大多数的对象会被回收,活着的进入s0
- 再次YGC,活着的对象eden + s0 -> s1
- 再次YGC,eden + s1 -> s0
- 年龄足够 -> 老年代 (其他GC:15;CMS:6)
- 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就可以申请内存,提供效率
- 无需调整