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
  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

栈上分配

TLAB

 TLAB,即线程本地分配

上一篇下一篇

猜你喜欢

热点阅读