JVM调优

JVM调优

Trace 跟踪参数

  • 打印简要GC

    • verbose:gc
    • -XX:+printGC
  • 打印详细GC

    • -XX:+PrintGCDetails
    • -XX:+PrintGCTimeStamps 打印GC发生的时间
  • 重定向GC.log

    • Xloggc:log/gc.log – 默认以当前目录为基础
  • 每次GC后,都打印堆信息

    • -XX:+PrintHeapAtGC
  • 监控类的加载

    • -XX:+TraceClassLoading
  • 打印类的使用情况

    • -XX:+PrintClassHistogram
  • 注: 需要在控制台下按下Ctrl+Break后才可以打印类的信息


  • 堆的分配参数

    • -Xmx:指定最大堆空间 -Xms:指定最小堆空间
  • 思考:

    1. -Xmx和-Xms应该保持一个什么关系,可以让系统的性能尽可能的好呢?
    2. 如果你要做一个Java的桌面产品,需要绑定JRE,但是JRE又很大,你如何做一下JRE的瘦身呢?
  • 设置新生代大小

    • -Xmn: 固定值
    • -XX:NewRatio: 按比例算(新生代[eden+2*s]和老年代[不包括永久区]). eg: 4, 1:4, 占整个堆的20%
    • -XX:SurvivorRatio: 设置两个Survivor区和eden的比. eg: 8, Survivor:eden=2:8, 即一个Survivor占年轻代的10%
    • -XX:+HeapDumpOnOutOfMemoryError: OOM时导出堆到文件
    • -XX:+HeapDumpPath: 导出文件位置
    • -XX:OnOutOfMemoryError: 在OOM时,执行一个脚本
  • 永久区分配参数

    • -XX:PermSize -XX:MaxPermSize
  • 注: 堆没有用完的情况也有可以抛出OOM,因为永久区造成的,具体查看GC明细


  • 栈大小分配
    • –Xss: 每个线程的本大小,分配的大小与容易的线程数成反比。

  • GC的算法与种类

    • 概念: 垃圾收集, 1960年List使用了GC, JAVA中 GC的对象是堆空间和永久区
    • 算法:

      1. 引用计数法 通过引用计算来回收垃圾 引用和去引用伴随的加法和减法,影响性能很难处理循环引用

      2. 标记清除法 现代垃圾回收算法的基础

      3. 标记压缩 适合用于对象较多的场合

      4. 复制算法 相对于标记法效率更高 不适合用于对象较多的情况, 如老年代 空间浪费, 整合标记清理思想


  • 分代思想

  • 可触及性

  • Stop-The-World


GC参数

串行收集器
最古老,最稳定
效率高
可能会产生较长的停顿
-XX:+UseSerialGC
  -- 新生代、老年代使用串行回收
  -- 新生代复制算法
  -- 老年代标记-压缩
并行收集器
ParNew
-XX:+UseParNewGC
  --新生代并行
  --老年代串行
-- Serial收集器新生代的并行版本
-- 复制算法
-- 多线程,需要多核支持
-- -XX:ParallelGCThreads限制线程数量
Parallel收集器
-- 类似ParNew
-- 新生代复制算法
-- 老年代 标记-压缩
-- 更加关注吞吐量
-- -XX:+UseParallelGC  使用Parallel收集器 + 老年代串行
-- -XX:+UseParallelOldGC 使用Parallel收集器 + 并行老年代
并行参数
  -XX:MaxGCPauseMills 
    -- 最大停顿时间,单位毫秒
    -- GC尽力保证回收时间不超过设定值(参考,可能会超过设置的时间)

  -XX:GCTimeRatio
    -- 0-100的取值范围
    -- 垃圾收集时间占总时间的比
    -- 默认99,即最大允许1%时间做GC

  这两个参数矛盾,不能同时满足

CMS收集器
  -- Concurrent Mark Sweep 并发标记清除
  -- 标记--清除算法
  -- 标记-压缩相比
  -- 并发阶段会降低吞吐量
  -- 老年代收集器(新生代使用ParNew)  
  -- -XX:+UseConcMarkSweepGC
  -- -XX:+UseCMSCompactAtFullCollection Full GC 后,进行一次整理(整理过程是独占的,会引起停顿时间变长)
  -- -XX:+CMSFullGCsBeforeCompaction 设置进行几次Full GC后,进行一个整理
  -- -XX: ParallelCMSThreads 设定CMS的线程数量(通常和CPU核数相同)

  特点:
    -- 尽可能降低停顿
    -- 会影响系统整体吞吐量和性能
    -- 清理不彻底
    -- 因为和用户线程一起运行,不能在空间快满时再清理
      * -XX:CMSInitiatingOccupancyFraction设置触发GC的阈值
      * 如果不幸内存预留空间不够,就会引起 concurrent mode failure
       注: 改用串行收集器作为后备


    有关碎片
       标记--清除和标记-压缩
         -- 标记--清除有碎片产生
         -- 标记--压缩没有碎片产生

类装载器ClassLoader


系统性能监控

  • linux中常用功能

    • uptime:
    • top:
    • vmstat:
    • pidstat: 需要安装 sudo apt-get install sysstat
    • 特点: 可以监控线程状态 -t 参数, 监控CPU: -u, 监控IO: -d
  • Windows中的监控工具

    • 任务管理器
    • Perfmon 性能监控器
    • Process Explorer: 非自带
    • pslist: 非自带
  • Java自带的工具

    • MAT: eclipse 插件 Memory Analyzer (MAT)

偏向锁
  • -XX:+UseBiasedLocking 默认启用
  • 注: 在竞争激烈的场合,偏向锁会增加系统的负担
轻量级锁(BasicObjectLock)
  • 减少锁持有时间: 锁优化的基本思想
  • 减小锁粒度:
  • 锁分离: 根据功能进行锁分离 eg: 读写锁
锁消除(基于逃逸):
  • server -XX:+DoEscapeAnalysis -XX:+EliminateLocks 使用锁消除
  • server -XX:+DoEscapeAnalysis -XX:-EliminateLocks 不使用锁消除
CAS(Compare And Swap) 比较交换
  • CAS(V,E,N)
  • Concurrent.atomic包下面的类都是无锁的实现(利用的是CAS实现),比一般有锁的实现效率要高。

  1. 业务系统分开,业务库也分开

  2. 系统之间使用RPC通信

  3. 底层换成 mybatis, 把数据库的MetaData全部缓存到Redis中

  4. 底层的DynamicDatasource切换需要修改


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值