垃圾回收判断算法
引用计数法
计数为0时,会被回收
问题:相互引用,循环引用
可达性算法
GCRoot指向不可回收的对象
- 虚拟机栈中本地变量表引用的对象。
- 方法区中的类静态变量引用的对象
- 方法区中常量引用的对象
- 本地方法栈中JNI引用的对象
问题:不可达一定会回收?
finalize()方法挽回一次,异步的
引用
- 强引用
- 软引用 SoftReference 内存不够时被GC
- 弱引用
- 虚引用
对象 ===> 分配 ===>满了 ===> 回收
内存分配 minorGC
对象分配eden
栈上分配内存解决多线程并发创建对象,锁机制消耗CPU的情况。
TLAB:Thread Local Allocation Buffer eden区预分配
指针碰撞
Free List
对象分配老年代 major GC
- 对象很大
- 长期存活的对象 age=15
- 动态对象年龄判断
相同年龄所有对象的大小总和 > survivor 一半
分配担保:minorGC之前检查老年代最大可用连续空间 > 新生代所有对象总和。触发Full GC
垃圾回收
垃圾回收算法
- 标记-清除算法
- 复制回收算法
- 标记-整理算法
垃圾回收器 STW
新生代(复制回收算法)
- Serial:单线程
- ParNew :多线程 -XX ParallelGCThreads
- Parallel Scavenge(Server默认):全局吞吐量:运行用户代码时间 / (运行用户代码时间 + GC时间)
-XX:MaxGCPauseMillis=n
-XX:GCTimeRatio=n
-XX:UseAdaptiveSizePolicy GC Ergonomics
老年代
- CMS :
减少回收停顿时间
标记-清除算法
碎片 -XX:CMSInitiationgOccupancyFraction
Concurrent Mode Failure 启用Serial Old
-XX:+UseCMSCompactAtFullCollection
-XX:CMSFullGCsBeforeCompaction 执行多少次不压缩FullGC后 来一次带压缩的 0 表示每次都压
-XX:+UseConcMarkSweep - Serial Old(MSC)
CMS备用预案 Concurrent Mode Failusre时使用
标记-整理算法 - 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
影响:资源的消耗
网友评论