JVM大体结构

Java虚拟机调优  JVM优化 工作非常实用的调优-LMLPHP

如何确定垃圾

  • 引用计数
    • 会有循环引用的问题
  • 正向可达
    • 从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
04-29 03:15