JVM调优

垃圾

  • 怎么判断垃圾
    1. Reference counting 引用计数 代表语言,Python
    2. Root Searching 根可达算法 代表语言,JAVA

垃圾回收算法

  1. Mark-Sweep 标记清楚算法 会产生碎片
  2. Copying 复制算法 内存分两半 ,速度快浪费内存
  3. Mark-Compact 标记整理算法 效率低

GC调优的准则

  1. 多数Java应用不需要在服务器上进行GC优化
  2. 多数导致GC问题的java应用,都不是参数设置的问题,而是代码的问题
  3. 在应用上线之前,优先考虑将机器的JVM参数设置到最有化(最合适)
  4. 减少创建对象的数量
  5. 减少使用全局变量和大对象
  6. GC有化是到最后不得已才使用的手段
  7. 实际使用中,分析GC情况优化代码比优化GC 参数要多的多

GC调优的目的

  • 将转移到老年代的对象数量降低到最小
  • 减少GC的执行时间

GC调优策略

  • 策略1:将新对象预留在新生代,由于Full GC的成本要远大于Minor GC,因此,尽可能的将对象分配在新生代是明智的做法,实际项目中根据GC的日志分析新生代大小分配是否合理,适当通过“-Xmn”命令调节新生代的大小,最大限度降低新对象直接进入老年代的情况
  • 策略2:大对象直接进入老年代,虽然大部分情况下将对象分配在新生代是合理的,但大对象如果首次在新生代分配可能会导致空间不足,很多年龄不足的小对象被分配到老年代,破坏新生代的对象结构,可能会出现频繁的Full GC。因此,对于大对象,可以设置直接进入老年代(短命的大对象,对于垃圾回收来说简直是噩梦) -XX:PretendureSizeThreshold,设置进入老年代的年龄大小
  • 策略3:合理设置进入老年代对象的年龄 -XX:MaxTenuringThreshold,设置进入老年代的年龄大小,减少老年代的内存占用率,降低Full GC发生的频率
  • 策略4:设置稳定的堆大小 -Xms初始化堆大小,-Xmx最大堆大小

不需要调优

  • Minor GC执行时间不到50ms;Minor GC执行不频繁,约10s一次
  • Full GC执行时间不到1s;Full GC执行频率不算频繁,不低于10min一次

检查流程

  1. top命令观察问题,内存不断增长CPU占用率居高不下
  2. top -Hp 观察进程中的线程,哪个线程CPU和内存占比高
  3. jps定位具体java进程

JDK命令行工具

  1. jps:查看所有Java进程,类似于Linux 的ps命令

    1. jps:显示虚拟机执行主类名称以及这些进程的本地虚拟机唯一ID
    2. jps -l:输出主类的全名,如果进程是Jar包,输出Jar路径
    3. jps -v:输出虚拟机启动时JVM参数
    4. jps -m:输出传递给Java进程main()函数的参数
  2. jstat:监视虚拟机各种运行状态信息

    1. jstat -gc 进程号 :显示与进程相关的堆信息
    2. jstat -gccapacity 进程号 : 显示各个代的容量以及使用情况
    3. jstat -gcutil 进程号 : 显示垃圾收集信息

    jstat -gc -h3 进程号 1000 10 : 表示分析进程的gc情况,每隔1000ms打印一次记录,打印10次停止,每3行打印指标头

  3. jinfo:实时地查看和调整虚拟机各项参数

    1. jinfo 进程号: 输出当前JVM进程的全部参数和系统属性(第一部分是系统属性,第二部分是JVM参数)
    2. jinfo -flag name 进程号 : 输出对应名称的参数的具体值

    jinfo -flag PrintGC 进程号

你可能感兴趣的:(java,jvm)