JVM-环境准备&性能指标&基础知识

2023-09-21 20:32:13

环境准备&性能指标&基础知识

环境准备

JDK — 工具

JDK(Java Development Kit) 是用于开发 Java 应用程序的软件开发工具集合,包括了 Java 运行时的环境(JRE)、解释器(Java)、编译器(javac)、Java 归档(jar)、文档生成器(Javadoc)等工具。简单的说我们要开发 Java 程序,就需要安装某个版本的 JDK 工具包。

JRE — 环境

JRE(Java Runtime Enviroment )提供 Java 应用程序执行时所需的环境,由 Java 虚拟机(JVM)、核心类、支持文件等组成。简单的说,我们要是想在某个机器上运行 Java 程序,可以安装 JDK,也可以只安装 JRE,后者体积比较小。

JVM — 虚拟机

Java Virtual Machine(Java 虚拟机)有三层含义,分别是:

  • JVM规范要求;
  • 满足 JVM 规范要求的一种具体实现(一种计算机程序);
  • 一个 JVM 运行实例,在命令提示符下编写 Java 命令以运行 Java 类时,都会创建一个 JVM 实例,我们下面如果只记到 JVM 则指的是这个含义;如果我们带上了某种 JVM 的名称,比如说是 Zing JVM,则表示上面第二种含义。

JDK 与 JRE、JVM 之间的关系

就范围来说,JDK > JRE > JVM:

  • JDK = JRE + 开发工具
  • JRE = JVM + 类库

通过 JDK 开发的程序,编译以后,可以打包分发给其他装有 JRE 的机器上去运行。而运行的程序,则是通过 Java 命令启动的一个 JVM 实例,代码逻辑的执行都运行在这个 JVM 实例上。

常用性能指标

系统性能诊断

  1. 分析系统性能问题: 比如是不是达到了我们预期性能指标,判断资源层面有没有问题,JVM 层面有没有问题,系统的关键处理流程有没有问题,业务流程是否需要优化;
  2. 通过工具收集系统的状态,日志,包括打点做内部的指标收集,监控并得出关键性能指标数据,也包括进行压测,得到一些相关的压测数据和性能内部分析数据;
  3. 根据分析结果和性能指标,进行资源配置调整,并持续进行监控和分析,以优化性能,直到满足系统要求,达到系统的最佳性能状态。

性能相关资源:

  • CPU:CPU 是系统最关键的计算资源,在单位时间内有限,也是比较容易由于业务逻辑处理不合理而出现瓶颈的地方,浪费了 CPU 资源和过渡消耗 CPU 资源都不是理想状态,我们需要监控相关指标;
  • 内存:内存则对应程序运行时直接可使用的数据快速暂存空间,也是有限的,使用过程随着时间的不断的申请内存又释放内存,好在 JVM 的 GC 帮我们处理了这些事情,但是如果 GC 配置的不合理,一样会在一定的时间后,产生包括 OOM 宕机之类的各种问题,所以内存指标也需要关注;
  • IO(存储+网络):CPU 在内存中把业务逻辑计算以后,为了长期保存,就必须通过磁盘存储介质持久化,如果多机环境、分布式部署、对外提供网络服务能力,那么很多功能还需要直接使用网络,这两块的 IO 都会比 CPU 和内存速度更慢,所以也是我们关注的重点。

衡量系统性能维度

  • 延迟(Latency): 一般衡量的是响应时间(Response Time),比如平均响应时间。但是有时候响应时间抖动的特别厉害,也就是说有部分用户的响应时间特别高,这时我们一般假设我们要保障 95% 的用户在可接受的范围内响应,从而提供绝大多数用户具有良好的用户体验,这就是延迟的95线(P95,平均 100 个用户请求中 95 个已经响应的时间),同理还有99线,最大响应时间等(95 线和 99 线比较常用;用户访问量大的时候,对网络有任何抖动都可能会导致最大响应时间变得非常大,最大响应时间这个指标不可控,一般不用)。
  • 吞吐量(Throughput): 一般对于交易类的系统我们使用每秒处理的事务数(TPS)来衡量吞吐能力,对于查询搜索类的系统我们也可以使用每秒处理的请求数(QPS)。
  • 系统容量(Capacity): 也叫做设计容量,可以理解为硬件配置,成本约束。

性能指标分类

  • 业务需求指标:如吞吐量(QPS、TPS)、响应时间(RT)、并发数、业务成功率等。
  • 资源约束指标:如 CPU、内存、I/O 等资源的消耗情况。

可采用的手段和方式包括:

  • 使用 JDWP 或开发工具做本地/远程调试
  • 系统和 JVM 的状态监控,收集分析指标
  • 性能分析: CPU 使用情况/内存分配分析
  • 内存分析: Dump 分析/GC 日志分析
  • 调整 JVM 启动参数,GC 策略等等

性能调优总结

  • 制定指标,收集数据
  • 找瓶颈,然后分析解决瓶颈问题
  • 通过这些手段,找当前的性能极限值。压测调优到不能再优化了的 TPS 和 QPS,就是极限值。知道了极限值,我们就可以按业务发展测算流量和系统压力,以此做容量规划,准备机器资源和预期的扩容计划。
  • 在系统的日常运行过程中,持续观察,逐步重做和调整以上步骤,长期改善改进系统性能。

基础知识

  • 常见的编程语言类型
    • 机器语言:利用二进制编码进行指令的发送,能够被计算机快速地识别,其灵活性相对较高,且执行速度较为可观,机器语言与汇编语言之间的相似性较高,但由于具有局限性,所以在使用上存在一定的约束性。
    • 汇编语言:主要是以缩写英文作为标符进行编写的,运用汇编语言进行编写的一般都是较为简练的小程序,其在执行方面较为便利,但汇编语言在程序方面较为冗长,所以具有较高的出错率。
    • 高级语言:是由多种编程语言结合之后的总称,其可以对多条指令进行整合,将其变为单条指令完成输送,其在操作细节指令以及中间过程等方面都得到了适当的简化,所以,整个程序更为简便,具有较强的操作性,而这种编码方式的简化,使得计算机编程对于相关工作人员的专业水平要求不断放宽。
    • 简言之:
      • 机器语言是直接给机器执行的二进制指令,每种 CPU 平台都有对应的机器语言。
      • 汇编语言则相当于是给机器执行的指令,按照人可以理解的助记符表示,这样代码就非常长,但是性能也很好。
      • 高级语言则是为了方便人来理解,进而快速设计和实现程序代码,一般跟机器语言和汇编语言的指令已经完全没有关系了,代码编写完成后通过编译或解释,转换成汇编码或机器码,之后再传递给计算机去执行。
  • 高级语言分类
    • 按有无虚拟机
      • 有虚拟机:Java,Lua,Ruby,部分 JavaScript 的实现等等
      • 无虚拟机:C,C++,C#,Golang,以及大部分常见的编程语言
    • 按照变量是不是有确定的类型,还是类型可以随意变化来划分
      • 静态类型:Java,C,C++ 等等
      • 动态类型:所有脚本类型的语言
    • 按照是编译执行,还是解释执行,可以分为:
      • 编译执行:C,C++,Golang,Rust,C#,Java,Scala,Clojure,Kotlin,Swift 等等
      • 解释执行:JavaScript 的部分实现和 NodeJS,Python,Perl,Ruby 等等
    • 按照语言特点分类
      • 面向过程:C,Basic,Pascal,Fortran 等等;
      • 面向对象:C++,Java,Ruby,Smalltalk 等等;
      • 函数式编程:LISP、Haskell、Erlang、OCaml、Clojure、F# 等等。
  • 关于跨平台、运行时(Runtime)与虚拟机(VM)
    • 脚本语言直接使用不同平台的解释器执行,称之为脚本跨平台,平台间的差异由不同平台上的解释器去解决。这样的话代码很通用,但是需要解释和翻译,效率较低。
    • 编译型语言的代码跨平台,同一份代码,需要被不同平台的编译器编译成相应的二进制文件,然后再去分发和执行,不同平台间的差异由编译器去解决。编译产生的文件是直接针对平台的可执行指令,运行效率很高。但是在不同平台上编译复杂软件,依赖配置可能会产生很多环境方面问题,导致开发和维护的成本较高。
    • 编译型语言的二进制跨平台,同一份代码,先编译成一份通用的二进制文件,然后分发到不同平台,由虚拟机运行时来加载和执行,这样就会综合另外两种跨平台语言的优势,方便快捷地运行于各种平台,虽然运行效率可能比起本地编译类型语言要稍低一点。 而这些优缺点也是 Java 虚拟机的优缺点。
更多推荐

java spring cloud 企业工程管理系统源码+二次开发+定制化服务

鸿鹄工程项目管理系统SpringCloud+SpringBoot+Mybatis+Vue+ElementUI+前后端分离构建工程项目管理系统1.项目背景一、随着公司的快速发展,企业人员和经营规模不断壮大。为了提高工程管理效率、减轻劳动强度、提高信息处理速度和准确性,公司对内部工程管理的提升提出了更高的要求。二、企业通过

基于TCP的Qt网络通信

目录前言实现原理1.模块添加2.常用接口函数API3.QTcpServer3.1公共成员函数3.1.1构造函数3.1.2给监听的套接字设置监听3.1.3返回监听成功的套接字对象3.2信号4.QTcpSocket4.1公共成员函数4.1.1构造函数4.1.2连接服务器,需要指定服务器端绑定的IP和端口信息4.1.3接收数

CSP-J 2023 入门级 第一轮 阅读程序(1)

【题目】CSP-J2023入门级第一轮阅读程序(1)#include<iostream>#include<cmath>usingnamespacestd;doublef(doublea,doubleb,doublec){doubles=(a+b+c)/2;returnsqrt(s*(s-a)*(s-b)*(s-c));

七天学会C语言-第六天(指针)

1.指针变量与普通变量指针变量与普通变量是C语言中的两种不同类型的变量,它们有一些重要的区别和联系。普通变量是一种存储数据的容器,可以直接存储和访问数据的值。:intnum=10;//定义一个整数型普通变量num,赋值为10在例子中,变量num是一个普通整数变量,它直接存储了值10。指针变量是一种特殊类型的变量,它存储

面试经典刷题)挑战一周刷完150道-Python版本-第2天(22个题)

一、轮转数组给定一个整数数组nums,将数组中的元素向右轮转k个位置,其中k是非负数。这用于旋转一个整数列表nums中的元素。k%=len(nums):这一行的目的是确保k的值在合理的范围内,因为如果k大于列表的长度len(nums),旋转是循环的,所以我们取余数来确保k在合适的范围内,以避免不必要的重复旋转。比如,如

【Java 基础篇】Java网络编程实时数据流处理

在现代计算机应用程序中,处理实时数据流是一项关键任务。这种数据流可以是来自传感器、网络、文件或其他源头的数据,需要即时处理并做出相应的决策。Java提供了强大的网络编程工具和库,可以用于处理实时数据流。本文将详细介绍如何使用Java进行实时数据流处理。什么是实时数据流?实时数据流是一连串持续不断到达的数据,需要及时处理

【UE 粒子练习】08——LOD概述

目录概念应用举例一、检查当前粒子系统中是否设置了LOD二、添加LOD三、LOD设置(单个粒子发射器)四、LOD设置(多个粒子发射器)概念在UnrealEngine中,LOD(LevelofDetail,细节层次)是一种优化技术,用于在不同距离或屏幕空间尺寸下使用不同的模型或网格,以提高性能并减少资源消耗。LOD技术的主

低功耗蓝牙物联网:未来连接的无限可能

物联网是连接各种设备和传感器的网络,其目的是实现信息的交换和共享,提高效率并优化生活。在这个领域,低功耗蓝牙(BLE)正在发挥着越来越重要的作用。低功耗蓝牙是一种无线通信技术,它的主要特点是低功耗和长寿命。在保证纽扣电池长时间使用的同时,BLE的广播模式功耗可以做到1mA以下,进入低功耗模式后甚至可以达到200ua以下

第一个 Go 程序“hello,world“ 与 main 函数

第一个Go程序"hello,world"与main函数文章目录第一个Go程序"hello,world"与main函数一.创建“hello,world”示例程序二.“hello,world”程序结构拆解三、main函数四、Go语言中程序是怎么编译的?一.创建“hello,world”示例程序创建一个叫做main的go文件

Haproxy负载均衡集群 超详细 (附部署实例)

Haproxy一、Web集群调度器1.1常用的Web集群调度器1.2常用集群调度器的优缺点(LVS,Nginx,Haproxy)1.2.1Nginx1.2.2LVS1.2.3Haproxy1.3LVS、Nginx、Haproxy的区别二、Haproxy2.1简介2.2Haproxy的主要特性2.3Haproxy应用分析

总结 HTTP 协议的基本格式和 fiddler 的用法

HTTP基本格式HTTP协议也是日常开发中非常常用的的一种协议,在众多协议栈里HTTP可能是实际开发中用的最多的。注意这里说的HTTP是指HTTP1以及HTTP2,他们都是基于TCP协议的,注意:如今最新版的HTTP3是基于UDP的。但如今在互联网中使用的最多的仍然是HTTP1.1的版本。在整个协议栈中,上层和下层之间

热文推荐