JVM大体结构
如何确定垃圾
- 引用计数
- 会有循环引用的问题
- 正向可达
- 从roots对象计数可以达到的对象
垃圾收集算法
标记清除(缺点:内存碎片化,没有连续的内存)
Copying (缺点:浪费内存 一般用在新生代[new])
标记压缩 (比copying慢一点 一般用在老年代[tenured])
new
- 存活对象少
- 使用copying,占用的内存空间也不大,效率也高
old
- 垃圾少
- 一般使用mark-compact
了解一下上一篇《垃圾收集器》
- Serial Collector
- XX:+UseSerialGC
- 单线程
- Parallel Collector
- 并行量大,不过每次垃圾收集,JVM会停顿
- CMS Collector
- 并发分区来完成,停顿时间短
- G1
- 不仅停顿短,同事并发大。仅仅是个平衡点
- 有人说建议Java9用这个
JVM 参数
- - 标准参数,所有jvm 都应该支持
- -X 非标,每一个jvm实现都不同
- -XX 不稳定参数,下一个版本可能会取消
java 对象的分配
- 栈上分配
- 线程私有小对象
- 无逃逸(-XX:+DoEscapeAnalysis开启逃逸分析 默认是开启的)
- 支持标量替换
- 无需调整
- 线程本地分配TLAB(Thread Locla Allacation Buffer)在堆上也是eden区,这样做的目的是有一部分数据可以不加锁
- 占用eden,默认1%
- 多线程的时候不用竞争eden就可以申请空间,提高效率
- 小对象
- 无需调整
- 老年代
- 大对象
- eden