首页 > 其他 > 详细

JVM + GC 一遍过

时间:2021-05-28 19:24:32      阅读:25      评论:0      收藏:0      [点我收藏+]

1 JVM内存模型

技术分享图片

2 GC策略之算法

根搜索算法

  • 标记复制
  • 标记清除 缺点1: 效率比较低(递归与全堆对象遍历 GC的时候 停止程序) 缺点2: 内存碎片化
  • 标记整理
标记: 遍历GCRoots 可达性分析

清除: 清除所有未标记

效率 复制 > 整理 > 清除

内存整齐度 复制 = 整理 > 清除

内存利用率 整理 = 清除 > 复制

GCRoots对象

? 1、虚拟机栈中的引用的对象。

? 2、方法区中的类静态属性引用的对象。

? 3、方法区中的常量引用的对象。

? 4、本地方法栈中JNI的引用的对象

普通GC(minor GC):只针对新生代区域的GC。****全局GC(major GC or Full GC):针对年老代的GC

  • 对象晋升

    1. 年龄阈值

        VM为每个对象定义了一个对象年龄(Age)计数器, 对象在Eden出生如果经第一次Minor GC后仍然存活, 且能被Survivor容纳的话, 将被移动到Survivor空间中, 并将年龄设为1. 以后对象在Survivor区中每熬过一次Minor GC年龄就+1. 当增加到一定程度(-XX:MaxTenuringThreshold, 默认15), 将会晋升到老年代.

    2. 提前晋升: 动态年龄判定

        然而VM并不总是要求对象的年龄必须达到MaxTenuringThreshold才能晋升老年代: 如果在Survivor空间中相同年龄所有对象大小的总和大于Survivor空间的一半, 年龄大于或等于该年龄的对象就可以直接进入老年代, 而无须等到晋升年龄.

3 垃圾收集器

G1收集器

  • 空间整合
  • 可预测停顿

java堆内存分为大小相等独立的Region

CMS收集器

CMS(Conrrurent Mark Sweep)收集器是以获取最短回收停顿时间为目标的收集器。使用标记 - 清除算法,收集过程分为如下四步:

  1. 初始标记,标记GCRoots能直接关联到的对象,时间很短。
  2. 并发标记,进行GCRoots Tracing(可达性分析)过程,时间很长。
  3. 重新标记,修正并发标记期间因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录,时间较长。
  4. 并发清除,回收内存空间,时间很长。

其中,并发标记与并发清除两个阶段耗时最长,但是可以与用户线程并发执行。

技术分享图片

4 JVM命令

4.1 jps -v

技术分享图片

4.2 jinfo

4.3 jstat -gc 2609 500 10 0.5输出一次 一共10次

技术分享图片

4.4 jmap

4.5 jstack 查看线程运行状态

  • Top + jstak 分析CPU过高 top -Hp 2609 查看2609进程最耗性能的线程 shift+p cpu排序 shiftp+m 内存排序
  • Printf ‘%x‘ 2609 转16进制

关注线程状态

  1. 死锁,Deadlock(重点关注)
  2. 执行中,Runnable
  3. 等待资源,Waiting on condition(重点关注)
  4. 等待获取监视器,Waiting on monitor entry(重点关注)
  5. 暂停,Suspended
  6. 对象等待中,Object.wait() 或 TIMED_WAITING
  7. 阻塞,Blocked(重点关注)
  8. 停止,Parked

4.6 vmstat可以查看线程切换消耗

JVM + GC 一遍过

原文:https://www.cnblogs.com/albertXe/p/14823435.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!