JVM调优笔记

57 阅读3分钟

双亲委派机制

app---->ext----->bootstrap 保证系统的核心库不被修改

沙箱安全机制

限制系统资源访问,将java代码限制在虚拟机特定的运行范围中

基本组件

  • 字节码校验器 确保java类文件遵循java规范,帮助java程序实现内存保护
  • 类加载器

native

Java的作用范围达不到了,需要调用底层

栈内存主管程序的运行,生命周期和线程同步

对象的实例化过程

Heap 一个JVM只有一个堆内存,堆内存的大小可调节 堆: 类、方法、常量、变量、引用类型的真实对象 gc的垃圾回收主要是在eden和old区域。 默认情况下,分配的总内存是电脑内存的1/4, 初始化内存是1/64

 public class JvmTest {
 ​
   public static void main(String[] args) {
     long maxMemory = Runtime.getRuntime().maxMemory();
     long totalMemory = Runtime.getRuntime().totalMemory();
     // maxMemory: 3.56GB
     // totalMemory: 245.5MB
     // -Xmx1024m -Xmx1024m -XX:+PrintGCDetails
     // +HeapDumpOnOutOfMemoryError
     System.out.println("maxMemory: " + FileUtil.formatFileSize(maxMemory) + "\ntotalMemory: " + FileUtil.formatFileSize(totalMemory));
   }
 ​
 }

JVM问题排查

Arthas

Minor GC、Major GC和full GC的区别

  • MInor GC 新生代收集,非常的频繁,回收的速度快
  • Old GC 老年代收集,CMS收集器单独收集老年代的行为
  • Full GC 整堆收集 对整个java堆和方法区的垃圾收集
  • Mixed GC 混合收集,收集整个新生代和老年代,目前只有G1收集器

JVM 调优工具

jps

查看java的进程 image.png image.png

 -q 输出进程号
 -m 输出传递给主函数的参数
 -l 主函数的路径

jstat

查看堆信息

 options:由以下值构成
 -class:显示ClassLoader的相关信息
 -compiler:显示JIT编译的相关信息
 -gc:显示与GC相关信息
 -gccapacity:显示各个代的容量和使用情况
 -gccause:显示垃圾收集相关信息(同-gcutil),同时显示最后一次或当前正在发生的垃圾收集的诱发原因
 -gcnew:显示新生代信息
 -gcnewcapacity:显示新生代大小和使用情况
 -gcold:显示老年代信息
 -gcoldcapacity:显示老年代大小
 -gcpermcapacity:显示永久代大小
 -gcutil:显示垃圾收集信息

image.png

jinfo

查看运行的java程序的拓展参数,支持运行时,修改部分参数 image.png

jmap

查看堆内存使用 image.png

调优思路

运维团队配置的JVM参数已经能满足多数的需求,在个人理解下,JVM调优其实是在理解JVM内存结构以及各种垃圾收集器的前提下,结合现有的业务来调整参数,使应用稳定的运行。参考的指标【吞吐量】、【停顿时间】、【垃圾回收的频率】。

  1. 内存区域大小以及相关策略 (堆内存大小、新生代/老年代占比等---> IO密集型/内存计算密集型)
  2. 垃圾回收器,比如(-XX:+UseG1GC:指定 JVM 使用的垃圾回收器为 G1

-XX:MaxGCPauseMillis:设置目标停顿时间 -XX:InitiatingHeapOccupancyPercent:当整个堆内存使用达到一定比例,全局并发标记阶段 就会被启动等等 多数情况下,JVM已经能够达到开箱即用。

  1. jps查看进程的基础信息, jstat用于看GC的情况、jinfo进程参数、jmap内存信息 dump文件-->内存解析工具、jstak线程信息,排查死锁

JIT优化

内联优化和逃逸分析

内联优化

把目标方法的代码复制到调用的方法中,避免发生真实的方法调用。每次方法的调用都会生成栈帧(压栈出栈记录方法调用的位置),会带来一定的性能损耗。调整(-XX:MaxFreqInlineSize)

逃逸分析

判断一个对象是否被外部方法引用或者外部线程访问的分析技术。 image.png