Java 性能调优的基本概念和定义

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡/ 赠书活动

目前,正在 星球 内带小伙伴们做第一个项目:全栈前后端分离博客项目,采用技术栈 Spring Boot + Mybatis Plus + Vue 3.x + Vite 4手把手,前端 + 后端全栈开发,从 0 到 1 讲解每个功能点开发步骤,1v1 答疑,陪伴式直到项目上线,目前已更新了 204 小节,累计 32w+ 字,讲解图:1416 张,还在持续爆肝中,后续还会上新更多项目,目标是将 Java 领域典型的项目都整上,如秒杀系统、在线商城、IM 即时通讯、权限管理等等,已有 870+ 小伙伴加入,欢迎点击围观

1.1) JDK 与 JRE

  • JRE = JVM + 类库

  • JDK = JRE + 开发工具(javac、jconsole 等)

  • 服务器 JRE(Jre 7u21 以上,无自动更新)

1.2)安装JDK

  • 视窗

  • Linux64:服务器 JRE 64 位

  • Solaris:首先进入第 32 步,然后是 64 位版本

1.3) JVM 的主要组件

热点虚拟机运行时:

  • 命令行选项解析

  • JVM 生命周期

  • 异常处理

  • 致命异常处理

  • 类加载

  • 口译员

  • Java本机接口

  • 线程管理和同步

垃圾收集器——内存管理器

  • 影响java应用程序的性能

  • Hotspot JVM 有 4 个 GC:

    • 两个被称为“停止世界时刻”(STW GC)垃圾收集器,另外两个是
      STW 和并发 GC 的组合

STW GC==> 停止所有 Java 应用程序线程。

大多数并发 GC ==> concurrenlty 在 java 应用程序运行时执行

年轻一代VS老一代。

  • Perm Gen (Java 6&7) 类元数据,类数据结构。 Java 8 中不存在 PermGen,只有元空间。

热点GC:

  • Serial GC,单线程 STW 新生代收集器 + 单线程 STW 老年代收集器

(占地面积小)

  • Throughput GC,多线程 STW young + old gen collectorCMS concurrent garbage collector,STW young and ,mostly concurrent old generation

  • G1 垃圾收集器 (>jdk7u4) 多线程 STW region based young GC + STW 和 mostly 的组合

  • 并发老年代 GC:G1 vs CMS ==> G1 compact old gen 不需要 Full GC

即时编译器

  • 采用字节码 ==> 底层平台的本机代码。

了解运行时系统

  • Java -XX:+PrintFlagsFinal -version ==> 查看 JVM 的运行时参数

  • VisualVM 上的 Visual GC 插件

  • 内存池插件

代码缓存——JIT 编译的代码量

  • 对于大型企业应用程序,代码缓存空间可能会耗尽,导致应用程序变慢,因为它禁用了 JIT 编译

要监控的指标

  • 操作系统级别

  • 虚拟机

  • 应用

操作系统级别

-CPU使用率:用户CPU、系统CPU和空闲时间
用户 CPU:程序在 OS 内核之外花费的时间
内核(系统)SPU——花费在执行内核代码上的百分比
空闲 CPU – 未使用的 CPU 百分比
目标是执行更多的用户CPU

-虚拟内存使用
换货注意!!!

-进程行为:上下文切换、CPU调度、线程迁移

两种上下文切换:

  1. 自愿:由于锁定或等待 IO,应用程序线程自愿脱离 CPU

    1. this 的高值 ==> 锁争用的指示

  2. 非自愿:==> 有大量应用程序线程多于可用的 CPU 内核

CPU调度队列—>大量app。线程与 CPU 内核数量少 ==> 系统缓慢

磁盘输入输出

网络输入输出

在 Windows 上监控指标
PerfMon——可视化工具
特权时间——内核时间
https://technet.microsoft.com/en-us/library/bb490960.aspx

typeperf-cpu.txt

前 typeperf -si 5 -cf typeperf-cpu.txt

监控 CPU 调度

监控虚拟内存使用情况

监视可用内存和分页活动

如果分页过于频繁 ==> 交换 http://en.wikipedia.org/wiki/Paging