美文网首页
JVM 垃圾回收机制

JVM 垃圾回收机制

作者: 康俊1024 | 来源:发表于2019-04-07 15:44 被阅读0次

垃圾回收判断算法

引用计数法

计数为0时,会被回收
问题:相互引用,循环引用

可达性算法

GCRoot指向不可回收的对象

  1. 虚拟机栈中本地变量表引用的对象。
  2. 方法区中的类静态变量引用的对象
  3. 方法区中常量引用的对象
  4. 本地方法栈中JNI引用的对象
    问题:不可达一定会回收?
    finalize()方法挽回一次,异步的

引用

  1. 强引用
  2. 软引用 SoftReference 内存不够时被GC
  3. 弱引用
  4. 虚引用

对象 ===> 分配 ===>满了 ===> 回收

内存分配 minorGC

对象分配eden

栈上分配内存解决多线程并发创建对象,锁机制消耗CPU的情况。
TLAB:Thread Local Allocation Buffer eden区预分配
指针碰撞
Free List

对象分配老年代 major GC

  1. 对象很大
  2. 长期存活的对象 age=15
  3. 动态对象年龄判断
    相同年龄所有对象的大小总和 > survivor 一半
    分配担保:minorGC之前检查老年代最大可用连续空间 > 新生代所有对象总和。触发Full GC

垃圾回收

垃圾回收算法

  1. 标记-清除算法
  2. 复制回收算法
  3. 标记-整理算法

垃圾回收器 STW

新生代(复制回收算法)

  1. Serial:单线程
  2. ParNew :多线程 -XX ParallelGCThreads
  3. Parallel Scavenge(Server默认):全局吞吐量:运行用户代码时间 / (运行用户代码时间 + GC时间)
    -XX:MaxGCPauseMillis=n
    -XX:GCTimeRatio=n
    -XX:UseAdaptiveSizePolicy GC Ergonomics

老年代

  1. CMS :
    减少回收停顿时间
    标记-清除算法
    碎片 -XX:CMSInitiationgOccupancyFraction
    Concurrent Mode Failure 启用Serial Old
    -XX:+UseCMSCompactAtFullCollection
    -XX:CMSFullGCsBeforeCompaction 执行多少次不压缩FullGC后 来一次带压缩的 0 表示每次都压
    -XX:+UseConcMarkSweep
  2. Serial Old(MSC)
    CMS备用预案 Concurrent Mode Failusre时使用
    标记-整理算法
  3. Parallel Old
    标记-整理算法

G1

回收的时间节点 工作线程和GC线程协调 STW

安全点:方法调用之前之后, 循环跳转,异常跳转

安全区:不是立刻STW

如何查看当前的垃圾回收器

-XX:+PrintFlagsFinal
-XX:+PrintCommandLineFlags
server client
MBean

GC日志

1.输出日志
-XX:+PrintGCTimeStamps
-XX:+PrintGCDetails
-Xloggc:/home/administrator/james/gc.log
-XX:+PrintHeapAtGC
2.日志文件控制
-XX:-UseGCLogFileRotation
-XX:GCLogFileSize=8K
3.怎么看

JDK自带的 监控工具

jmap -heap pid 堆使用情况
jstat -gcutil pid 1000
jstack 线程dump
jvisualvm
jconsole

死锁案例

jvisualvm
dump文件:查看deadlock BLOCKED waiting to lock
影响:资源的消耗

相关文章

网友评论

      本文标题:JVM 垃圾回收机制

      本文链接:https://www.haomeiwen.com/subject/nahobqtx.html