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

2023-09-21 20:32:54

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

环境准备

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 虚拟机的优缺点。
更多推荐

Map<K,V>的使用和List学习

MapMap是一种专门用来进行搜索的容器或者数据结构,其搜索的效率与其具体的实例化子类有关。对于静态类型的查找来说,一般直接遍历或者用二分查找【不会对区间进行插入和删除操作】而在现实生活中的查找比如:根据姓名查询考试成绩通讯录,即根据姓名查询联系方式不重复集合,即需要先搜索关键字是否已经在集合中注:Map最重要的特性就

【Redis】深入探索 Redis 的数据类型 —— 列表 List

文章目录一、List类型介绍二、List类型相关命令2.1LPUSH和RPUSH、LPUSHX和RPUSHX2.2LPOP和RPOP、BLPOP和BRPOP2.3LRANGE、LINDEX、LINSERT、LLEN2.4列表相关命令总结三、List类型内部编码3.1压缩列表(ziplist)3.2链表(linkedli

ceph分布式存储

目录一、概述二、组件三、架构图四、搭建一、概述ceph是一个统一的分布式存储系统,设计初衷是提供较好的性能、可靠性和可扩展性。特点:1.统一存储虽然ceph底层是一个分布式文件系统,但由于在上层开发了支持对象和块的接口。所以在开源存储软件中,能够一统江湖。至于能不能千秋万代,就不知了。2.高扩展性扩容方便、容量大。能够

前端Vue3+element-plus表单输入框实现Cron表达式校验

页面如下:本来想手写正则表达式校验,结果发现很麻烦,cron表达式组成如下:开发使用框架为vue3+element-plus,于是选择cron-validator依赖。使用步骤如下:1、通过npminstallcron-validator命令安装:2、可以通过package.json文件中看到,已安装成功。3、在你需要

自动化测试的生命周期是什么?

软件测试发展到今日,已经逐渐标准化且能力更强,其流程每天都在发展。测试人员的技术熟练程度对于整个测试阶段的成功来说至关重要。测试不再意味着仅仅发现错误;它的范围已经扩大,从任何开发项目开始就可以看出它的重要性。当谈论起自动化测试生命周期(AutomationTestingLifeCycle)时,大多数人认为这只是SDL

【vue】vue 中插槽的三种类型:

文章目录一、匿名插槽:``二、具名插槽:``三、作用域插槽一、匿名插槽:<slot></slot>1.没有为插槽指定名称2.通过slot标签可以添加匿名插槽3.在使用组件的时候,组件中的内容会填充到所有匿名插槽的位置,所以在封装组件的时候,匿名插槽一般只有一个4.匿名插槽可以设置默认的内容,如果没有传入内容就使用默认内

ceph分布式存储部署

一、概述是一个统一的分布式存储系统,设计初衷是提供较好的性能、可靠性和可扩展性。特点1、统一存储虽然ceph底层是一个分布式文件系统,但由于在上层开发了支持对象和块的接口。所以在开源存储软件中,能够一统江湖。至于能不能千秋万代,就不知了。2、高扩展性扩容方便、容量大。能够管理上千台服务器、EB级的容量。3、可靠性高支持

c++ 模版元编程 基于条件的编译

基于条件的编译是指根据不同的条件选择是否编译某段代码或选择不同的代码路径。在C++的模板元编程中,我们可以利用模板特化和std::enable_if技术来实现基于条件的编译。通过基于条件的编译,我们可以在编译期间根据类型特征或其他条件,决定采取不同的代码路径。这种能力使得我们可以针对不同类型或条件编写更加灵活和通用的代

死锁详细解读

目录死锁(1)一、死锁的定义二、产生死锁的原因三、产生死锁的四个必要条件四、解决死锁的方法死锁(2)第三节死锁避免一、死锁避免的概念二、安全状态与安全序列三、银行家算法第四节、死锁的检测与解除一、死锁的检测和解除二、死锁检测的算法三、解除死锁的方法死锁(3)第五节资源分配图一、资源分配图二、死锁定理第六节哲学家就餐问题

SIEM:网络攻击检测

如果您正在寻找一种能够检测环境中的网络威胁、发送实时警报并自动执行事件响应的网络攻击检测平台,Log360SIEM解决方案可以完成所有这些以及更多,能够准确检测安全威胁并遏制网络攻击。网络攻击检测能力基于规则的攻击检测MITREATT&CK实现来检测APTS基于ML的行为分析基于规则的攻击检测使用从Log360强大的关

Spring Cloud Alibaba Nacos注册中心(单机)

文章目录SpringCloudAlibabaNacos注册中心(单机)1.docker安装nacos(先别着急)2.配置nacos持久化到mysql、2.1properties文件3.java注册3.1POM文件3.2properties文件3.3测试配置中心4.注册中心4.1配置文件4.2测试类4.3补充演示Spri

热文推荐