JAVA程序的性能优化实践总结

news2025/2/12 11:06:07

1、 衡量程序性能的指标

可以从常用的性能评估指标入手:
在这里插入图片描述

  • 并发:同一时间有多少请求访问
  • TPS:transaction per second(每秒的事物数)
  • QPS:query per second(每秒请求数)
  • 耗时:端到端耗时,服务端耗时,应用程序耗时
  • 95线:95%的请求落在什么范围内
  • 99线:99%的请求落在什么范围内

2、Java 程序性能优化切入点

  1. 硬件优化:增加 CPU、内存、磁盘等硬件资源,提高程序运行效率。

  2. JVM 参数优化:调整 JVM 参数,包括堆大小、垃圾回收机制等,提高 JVM 性能。

  3. 代码优化:包括算法优化、数据结构优化、避免重复计算、复用优化、结果集优化(JSON)、资源冲突优化等。

  4. 计算优化:使用多线程技术,变同步为异步;惰性加载(使用设计模式优化业务),提高程序性能。

  5. 数据库优化:包括索引优化、SQL 语句优化等,提高数据库查询效率。

  6. 网络优化:包括减少网络传输数据量、使用缓存等,提高网络传输效率。

  7. 缓存优化:使用缓存技术,减少程序对数据库等资源的访问,提高程序响应速度。

  8. 日志优化:包括日志级别、日志格式等,减少不必要的日志输出,提高程序性能。

3、实用的性能优化手段

3.1、JVM调优

自动内存管理模型:
在这里插入图片描述
(1)程序计数器
一块较小的内存空间,可以看出当前线程所执行的字节码的行号指示器。在JVM的概念模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,它是程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖程序计数器来实现。线程私有。
(2)Java虚拟机栈
线程私有,生命周期与线程相同。虚拟机栈描述的Java方法(也就是字节码)执行的线程内存模型:每个方法执行的时候,Java虚拟机都会同步创建一个栈帧用于存储局部变量表(局部变量表存放了编译器可知的各种Java虚拟机基本数据类型(boolean、byte、char、short、int、float、long、double)、对象引用和returnAddress类型(指向了一条字节码指令的地址))、操作数栈、动态连接、方法出口等信息。每一个方法被调用直至执行完毕的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。
(3)本地方法栈
为执行本地(Native)方法服务。线程私有。
(4)Java堆
JVM垃圾回收器管理的最大的一块内存空间,线程共享,存放了几乎所有的实列对象。Java堆是垃圾收集器管理的内存区域,因此一些资料中它也被称作“GC堆”。
(5)方法区
线程共享,元空间。存储用于已经被Java虚拟机加载的类型信息、常量、即时编译器编译后的代码缓存等数据。
JDK8:永久代被元空间所替代。
a.运行时常量池
方法区的一部分,Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项是常量池表(Constant Pool Table),用于存放编译器生成的各种字面量与符号引用,这部分内容将在类加载后存放到方法区的运行时常量池中。
(6)直接内存
直接内存(Direct Memory)并不是虚拟机运行时数据区的一部分,也不是《Java虚拟机规范》中定义的内存区域。但是这部分内容也被频繁使用,而且也可能导致OutOfMemoryError异常出现。
在JDK1.4中引入了NIO(New Intput/Output)类,引入了一种基于通道(Channel)和缓冲区(Buffer)实现的I/O方式,它可以使用Native函数库直接分配堆外内存,然后通过一个存储在Java堆里的DirectByteBuffer对象作为这块内存的引用进行操作。这样能在一些场景中显著提高性能,因为避免了在Java堆和Native堆之间来回复制数据。
本机直接内存不会受到Java堆大小的限制,但是会受到本机总内存(包括物理内存、SWAP分区或分页文件)大小及处理器寻址空间的限制。一般服务器管理员在配置虚拟机参数时,会根据实际内存配置Xmx等参数,往往忽略掉直接内存,导致各内存区域总和大于物理内存区域限制(包括物理和操作系统及级的限制),从而导致动态扩展时出现OutOfMemorryError异常。

1、内存大小的取舍

(1)扩大内存可以降低触发GC的次数
(2)内存太大触发GC时的停顿时间也会太长
因此要根据实际的业务场景设置成一个“合适”的值,并配合压测和线上环境的实际情况不断的调优,建议:吞吐量=花费在非GC停顿上的工作时间/总时间>95%。
控制内存大小的核心JVM参数:

  • -Xms:启动JVM时堆内存的大小

  • -Xmx:堆内存最大限制
    建议:两者需要设置的一样防止扩缩容

  • -XX:NewSize 年轻代大小

  • -XX:MaxNewSize 最大年轻代大小
    建议:两者需要设置的一样防止扩缩容

  • -XX:SurvivorRation Eden与Survivor 占比,默认为8
    建议:Eden需要必Survivor尽可能的大(至少是一倍),防止多次触发young gc导致年龄快速增长到可以进入老年代的case

  • -XX:MetaspaceSize 元空间初始空间大小

  • -XX:MaxMetaspaceSize=512 元空间最大空间,默认是没有限制的。

2、GC优化策略

  • 将进入老年代的对象减少到最低
  • young gc: 40ms内
  • major gc:(老年代): stop the world时间总和控制在100ms内
  • full gc: 尽可能少,且时间在1s内
    除了cms和g1这两种GC收集器外,其余的major gc=full gc
    GC策略开启参数
    JVM调优标志,除了少数例外,JVM接收两种标志:
    布尔标志和附带参数的标志。布尔标志使用的语法是:
    -XX:+FlagName表示开启,-XX:-FlagName表示关闭
    附带参数的标志使用的语法是:-XX:FlagName=something,表示设置FlagName的值为something。其中,something指表示任意值的符号。例如,-XX:NewRatio=N表示NewRatio标志可以设成任意值N(N的含义将是讨论的重点)。
    在这里插入图片描述
    以CMS为例,看一下具体的参数配置:
    (1)CMS发生Full GC条件
  • Promotion failure:由于内存碎片导致的晋升空间不足
  • Concurrent mode failed:还未完成cms又触发了下一次major gc
    (2)CMS调优
    在这里插入图片描述

3.2、应用程序优化

1、日志优化

  • 同步日志/异步日志
  • 日志归档时间
  • 日志大小拆分

2、池化策略

  1. 核心线程数:
    动态获取CPU核数方法:
Runtime.getRuntime().availableProcessors()
  • CPU密集型:CPU核数+1
  • IO密集型:CPU核数*2

3.3、提高数据库读写性能

1、单机数据库

(1) 查询优化
主键查询:千万条记录 1-10ms
唯一索引:千万条记录 10-100ms
非唯一索引:千万条记录 100-1000ms
无索引:百万条记录 1000ms+
(2)批量写优化
for each{insert into table values(1)},性能极差
Exeute once insert into table values (1),(2),(3),(4)…;
批量写优势:
Sql编译N次=>1次的时间与空间复杂度有很大的性能差异
网络消耗的时间复杂度大幅降低
磁盘寻址的复杂度大幅降低
(3)索引优化
(4) innodb相关优化
在这里插入图片描述
在这里插入图片描述

2、分布式部署
(1)读写分离

  • 一主多从
  • 读库延迟处理
  • 主从切换处理

(2)分库分表

  • 垂直拆分
  • 水平拆分
  • 多主多从

3.4、缓存

缓存穿透、击穿、雪崩…

4、推荐书籍

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/639917.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

并行计算——MPI编程

目录 基础知识 进程与线程,并行与并发 奇偶排序 MPI实现 odd-even sort 思路 环境部署 编程实现(C) “若干”的问题 参考链接 一个偶然的机会,我接触到了国立清华大学的MPI编程作业,也就接触到了并行计算。这…

基于Python3接口自动化测试初探

自动化测试是什么? 自动化测试简单来说就是借助工具的方式来辅助手动测试的行为就可以看做是自动化测试。 自动化测试工具有哪些? 现在常用的自动化测试工具包括: QTP:主要用于回归测试和测试同一软件的新版本 Robot Framewor…

大数据ETL工具Kettle

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言最近公司在搞大数据数字化,有MES,CIM,WorkFlow等等N多的系统,不同的数据源DB,需要将这些不同的数据源DB里的数据进行整治统一…

【算法】模拟,高精度

高精度加法 P1601 AB Problem(高精) - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 思路就是模拟,值得注意的就是要用字符串类型输入。存进自己的int数组时要倒着存,因为如果是正着存的话,进位会有点trouble。 时间…

Spread.NET v16.0.20222.0 ASP.NET cRACK

关于 Spread.NET 提供类似 Excel 的电子表格体验。 Spread.NET 可帮助您创建电子表格、网格、仪表板和表单。它包括一个强大的计算引擎,具有450 函数以及导入和导出Excel电子表格的能力。利用广泛的 .NET 电子表格 API 和强大的计算引擎来创建分析、预算、仪表板、…

【C++ 基础篇:24】:【重要模板】C++ 输入输出运算符重载【以 Date 日期类为例】

系列文章说明 本系列 C 相关文章 仅为笔者学习笔记记录,用自己的理解记录学习!C 学习系列将分为三个阶段:基础篇、STL 篇、高阶数据结构与算法篇,相关重点内容如下: 基础篇:类与对象(涉及C的三大…

Mysql Access denied for user ‘root‘@ ‘*.*.*.*‘ (using password: YES)异常处理

目录 一、异常错误二、原因三、解决方法 一、异常错误 PS C:\Users\10568> mysql -u root -p Enter password: **** ERROR 1045 (28000): Access denied for user rootlocalhost (using password: YES)Access denied表示拒绝访问,using password:NO/…

计算机视觉 | 语义分割与Segmentation

前 言 「MMSegmentation」 是一个基于 PyTorch 的语义分割开源工具箱。它是 OpenMMLab 项目的一部分。 MMSegmentation v1.x 在 0.x 版本的基础上有了显著的提升,提供了更加灵活和功能丰富的体验。 主要特性 统一的基准平台 我们将各种各样的语义分割算法集成到了…

Linux权限维持

SSH后门&VIM后门 ssh后门: 创建一个软链接: ln -sf /usr/sbin/sshd /tmp/su 拓展:软链接相当于一个快捷键,硬链接相当于一个指针指向文件地址,也类似于复制 开启后门: /tmp/su -oport12345 开启后…

chatgpt赋能python:Python另存为:如何保存你的程序代码

Python另存为:如何保存你的程序代码 简介 Python是一种高级编程语言,最初由Guido van Rossum于1991年创建。自创建以来,Python已被广泛应用于Web开发、数据分析、人工智能等领域。作为一名有10年Python编程经验的工程师,我发现在…

万物的算法日记|第一天

笔者自述: 一直有一个声音也一直能听到身边的大佬经常说,要把算法学习搞好,一定要重视平时的算法学习,虽然每天也在学算法,但是感觉自己一直在假装努力表面功夫骗了自己,没有规划好自己的算法学习和总结&am…

内部服务器端口映射实验:打通内外网络,实现公网访问内部服务

内部服务器端口映射实验:打通内外网络,实现公网访问内部服务 【实验目的】 部署服务器地址转换。熟悉服务器地址转换的应用方法。验证配置。 【实验拓扑】 实验拓扑如图所示。 实验拓扑 设备参数如表所示。 设备参数表 设备 接口 IP地址 子网掩…

BOM,什么是BOM?

4.BOM 4.1 什么是BOM? BOM(Browser Object Model)即浏览器对象模型,它提供了独立于内容而与浏览器窗口进行交互的对象,其核心对象是 window。 ​ BOM 由一系列相关的对象构成,并且每个对象都提供了很多方法与属性。 …

react---todoList案例

todoList案例效果图 1.组件拆分 2.操作state数据 state 放在哪个组件: 如果某个组件组件使用: 放在其自身的state中。如果某些组件使用:放在他们共同的父组件state中(官方称此操作为状态提升) 状态(state)在…

Cocos creator实现飞机大战空中大战《战击长空》小游戏资源及代码

Cocos creator实现飞机大战空中大战《战击长空》小游戏资源及代码 最近在学习Cocos Creator,作为新手,刚刚开始学习Cocos Creator,刚刚入门,这里记录一下飞机大战小游戏实现。 https://wxaurl.cn/VEgRy2eTMyi 一 安装CocosDashBo…

Netty实战(十四)

WebSocket协议(二) 一、初始化 ChannelPipeline二、引导三、加密 一、初始化 ChannelPipeline 我们之前说过为了将 ChannelHandler 安装到 ChannelPipeline 中,需要扩展了ChannelInitializer,并实现 initChannel()方法。 下面我…

Nacos架构与原理 - 注册中心的设计原理

文章目录 Pre服务的分级模型 (服务-集群-实例三层模型)数据⼀致性负载均衡服务端侧负载均衡客户端侧负载均衡 健康检查性能与容量易用性集群扩展性用户扩展性 Pre 目前的网络架构是每个主机都有⼀个独立的 IP 地址,那么服务发现基本上都是通…

行为型设计模式07-命令模式

🧑‍💻作者:猫十二懿 ❤️‍🔥账号:CSDN 、掘金 、个人博客 、Github 🎉公众号:猫十二懿 命令模式 1、命令模式介绍 命令模式(Command),将一个请求封装为一…

【Linux后端服务器开发】常用开发工具

目录 一、apt / yum 二、gcc / g 三、make / makefile 四、vi / vim 五、gdb 一、apt / yum apt 和 yum 都是在Linux环境下的软件包管理器,负责软件的查找、安装、更新与卸载。 apt 是Ubuntu系统的包管理器,yum是Centos系统的包管理器&#xff0c…

SQL回顾总结,超级全

SELECT:语句用于从数据库中选取数据 从 "Websites" 表中选取 "name" 和 "country" 列 SELECT name,country FROM Websites 从 "Websites" 表中选取所有列 SELECT * FROM Websites; SELECT DISTINCT:用于返…