JVM之性能优化

news2024/11/24 2:49:11

1.JVM优化什么

由博客JVM之垃圾回收-CSDN博客我们已经了解到了数据存储是在方法区和堆区,而堆区的使用更为频繁。堆区有什么呢?老年代、新生代、GC。因此JVM性能优化,优化什么? 我们猜想一下,新生代的大小设置;老年代的大小设置;新生代到老年代的阈值设置;GC算法;大对象的存放阈值;无外乎是这么几种,于是我们带着这么些个问题来进一步探讨

2.JVM常用命令和工具

官网:Java Platform, Standard Edition Tools Reference for Oracle JDK on Solaris, Linux, and OS X, Release 8

jps  查看进程id

jinfo主要是查看JVM的配置参数
jinfo flag name PID
jinfo flag < name >=< value > PID
jinfo flags PID
jstat主要是做统计 -gc统计垃圾回收的次数
jstat class PID 1000 10 查看某个 java 进程的类装载信息,每 1000 毫秒输出一次,共输出 10
jstat gc PID 1000 10

jstack PID   查看JVM的详细堆栈信息

jmap heap PID     查看堆栈信息
2 jmap dump : format = b , file = heap . hprof PID   
3 XX : + HeapDumpOnOutOfMemoryError XX : HeapDumpPath = heap . hprof # 可以设置内存溢出时,自动导出文件

JDK通用工具:

jconsole: JDK自带的可视化监控工具。查看java应用程序的运行概况、监控堆信息、永久区使用情况、类加载情况等。

jvisualvm: 可以监控某个java进程的CPU,类,线程等

 内存分析工具:

MAT: java堆分析器,用于查找内存泄漏

HeapHero: Brilliant Graphs, metrics and java heap dump analysis anti-patterns reported (heaphero.io)

Perfma:https://console.perfma.com/

GC分析工具:

 GC日志:可以使用不同的参数设置不同的日志文件,比如:

 ‐XX:+PrintGCDetails ‐XX:+PrintGCTimeStamps ‐XX:+PrintGCDateStamps ‐Xloggc:D:\gc.log

gcviewer

java ‐jar gcviewer‐1.36‐SNAPSHOT.jar

gceasy Universal JVM GC analyzer - Java Garbage collection log analysis made easy (gceasy.io)

3.JVM性能优化

JVM的性能优化可以分为代码层面和非代码层面的。

        在代码层面,大家可以结合字节码指令,内存是否浪费等进行优化,比如一个循环语句,可以将循环不相关的代码提取到循环体之外,这样在字节码层面就不需要重复执行这些代码了。

        在非代码层面,一般情况可以从参数、内存、GC以及CPU占用率等方面进行优化。

注意:JVM调优是一个漫长和复杂的过程,而在很多情况下,JVM是不需要优化的,因为JVM本身已经做了很多内部优化操作,千万不要为了调优而调优。

3.1 代码优化

        再举一个例子,比如一个ArrayList,初始容量为10,而我们是需要添加11个元素的,假设我们添加到了第11个元素,则就触发了ArrayList的扩容,扩容到了15,而我们只使用了11个内存空间,剩下的4个是不是就内存浪费了,因此我们在初始化的时候,如果确定知道了List的大小,则直接进行初始化,对内存资源的合理利用。

3.2  参数优化

参数官网: java (oracle.com)

1 XX : MaxTenuringThreshold
Sets the maximum tenuring threshold for use in adaptive GC sizing . The largest value is 15. The default value is 15 for the parallel ( throughput ) collector , and 6 for the CMS collector .
2 XX : PretenureSizeThreshold
超过多大的对象直接在老年代分配,避免在新生代的Eden S 区不断复制
3 XX : +/‐ UseAdaptiveSizePolicy
Enables the use of adaptive generation sizing . This option is enabled by default .
4 XX : SurvivorRatio
默认值为 8
5 XX : ConcGCThreads
Sets the number of threads used for concurrent GC . The default value depends on the number of CPUs available to the JVM .
(6 Xsssize
Sets the thread stack size ( in bytes ). Append the letter k or K to indicate KB
7 Xms Xmx
两者值一般设置成一样大,防止内存空间进行动态扩容
8 XX : ReservedCodeCacheSize
  Sets the maximum code cache size ( in bytes ) for JIT compiled code . Append the letter k or K to indicate kilobytes , m or M to indicate megabytes , g or G to indicate gigabytes .

3.3 内存调优

举个案例:

假设每台机器配置2C4G,以每秒3000笔订单为例,整个过程持续60秒(大并发场景下)

       假设我们订单的对象Order为1kb,则每秒1000个订单就是1000kb,又假设我们这个订单对象有非常多的关联对象,大概有30个,则每秒中所占用的内存就是30M。2C4G的配置,堆内存为4000MB,默认Young:Old = 1:2 所以young区大约为1333MB;大概过了45秒左右,young区就不够用了,就回去增加old的压力,最终不仅会发生young GC 还有可能发生Old GC。怎么解决?增加机器? No   可以此时将young:old设置成2:1  这样一来,young区大概就会有2666MB了。

内存泄漏导致内存溢出的问题排查:

01 启动
java jar Xms1000M Xmx1000M XX : + HeapDumpOnOutOfMemoryError XX : HeapDumpPath = jvm . hprof jvm case 0.0.1 SNAPSHOT . ja r
02 使用 jmeter 模拟并发
03 使用 top 命令查看
top
top Hp PID
04 jstack 查看有没有死锁或者 IO 阻塞
  jstack PID
05 查看堆内存使用情况
jmap heap PID
java jar arthas . jar ‐‐‐> dashboard
06 获取到 heap 的文件,比如 jvm . hprof ,用相应的工具来分析,比如 heaphero . io

3.4 CPU占用率过高

1 top
2 top Hp PID
查看进程中占用 CPU 高的线程 id ,即 tid
3 jstack PID | grep tid 1 top

3.5 GC调优

重点分析G1垃圾收集器(因为G1垃圾收集器是分成了各个region 设置的参数比较多)

(1)使用 G1 GC垃圾收集器,获取到日志文件:-Xms100M -Xmx100M
(2)调整堆内存大小:-Xms300M -Xmx300M
(3)调整最大停顿时间:-XX:MaxGCPauseMillis=200 设置最大GC停顿时间指标
(4)启动并发GC时堆内存占用百分比:-XX:InitiatingHeapOccupancyPercent=45
G1用它来触发并发GC周期,基于整个堆的使用率,而不只是某一代内存的使用比例。值为0则表示“一直执行GC循环”. 默认值为 45 (例如, 全部的 45% 或者使用了45%)

4.JVM性能优化指南

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

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

相关文章

模型实战(22)之 C++ - tensorRT部署yolov8-cls 目标分类

C++ - tensorRT部署yolov8-cls 目标分类 在检测应用场景中如果有同等类别不同形态的目标,单纯的目标检测可能达不到实用或者想要的精度,这就需要衔接一步分类python环境下如何直接调用推理模型转换并导出:pt -> onnx ->.engineC++ tensorrt 部署分类模型1.Python环境下…

【OrangePi AIpro】香橙派 AIpro 为AI而生

产品简介 OrangePi AIpro(8T)&#xff1a;定义边缘智能新纪元的全能开发板 在当今人工智能与物联网技术融合发展的浪潮中&#xff0c;OrangePi AIpro(8T)凭借其强大的硬件配置与全面的接口设计&#xff0c;正逐步成为开发者手中的创新利器。这款开发板不仅代表了香橙派与华为…

2024最新 Jenkins + Docker实战教程(七)- Jenkins实现远程传输和自动部署

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

powershell 配合aria2实现简单的图片爬取

powershell 配合aria2实现简单的图片爬取 01 前言 现如今&#xff0c;提到爬虫&#xff0c;令人不得不提到Python&#xff0c;确实简单&#xff0c;也强大&#xff0c;到处都可以找到教程。故而今天换换口味&#xff0c;用powershell来实现&#xff0c;配合aria2的强大下载功…

鸿蒙开发接口图形图像:【@ohos.window (窗口)】

窗口 窗口提供管理窗口的一些基础能力&#xff0c;包括对当前窗口的创建、销毁、各属性设置&#xff0c;以及对各窗口间的管理调度。 该模块提供以下窗口相关的常用功能&#xff1a; [Window]&#xff1a;当前窗口实例&#xff0c;窗口管理器管理的基本单元。[WindowStage]&…

【单片机毕设选题】-智能语音控制风扇

一. 系统功能 此设计采用STM32和SU-03T离线语音模块来控制风扇, 主要功能如下: 1. 通过DHT11温湿度模块来采集环境温湿度。 2. 通过SU-03T语音模块来控制风扇启停加减速等。 3. 通过OLED显示系统状态。 4. 可以通过按键控制风扇启停加减速等。 5. 通过蓝牙模块监视系统状…

内网安全之证书模版的管理

证书模板 Certificate templates 是 CA 证书颁发机构的一个组成部分&#xff0c;是证书策略中的重要元素&#xff0c;是用于证书注册、使用和管理的一组规则和格式。当 CA 收到对证书的请求时&#xff0c;必须对该请求应用一组规则和设置&#xff0c;以执行所请求的功能&#x…

【创作活动】探索 GPT-4o:下一代语言模型的技术革命

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

Thingsboard规则链:Customer Details节点详解

在物联网&#xff08;IoT&#xff09;平台Thingsboard的规则引擎体系中&#xff0c;Customer Details节点是一个功能强大的组件&#xff0c;它专为处理与客户&#xff08;Customer&#xff09;实体相关的综合信息而设计。这个节点不仅能够读取客户的基本属性&#xff0c;还能提…

VBA技术资料MF159:实现某个区域内的数据滚动

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…

【微服务】springboot 构建docker镜像多模式使用详解

目录 一、前言 二、微服务常用的镜像构建方案 3.1 使用Dockerfile 3.2 使用docker plugin插件 3.3 使用docker compose 编排文件 三、环境准备 3.1 服务器 3.2 安装JDK环境 3.2.1 创建目录 3.2.2 下载安装包 3.2.3 配置环境变量 2.2.4 查看java版本 3.3 安装maven …

F. Longest Strike[双指针详解]

Longest Strike 题面翻译 给你一个长度为 n n n 的序列 a a a 和一个整数 k k k&#xff0c;你要求一个区间 [ l , r ] [l,r] [l,r] 满足&#xff1a; 对于任何整数 x ∈ [ l , r ] x∈[l,r] x∈[l,r]&#xff0c; x x x 在 a a a 中的出现次数不少于 k k k 次。最大…

【Postman接口测试】第四节.Postman接口测试项目实战(上)

文章目录 前言一、项目介绍 1.1 项目界面功能介绍 1.2 项目测试接口介绍 1.3 项目测试接口流程二、HTTP协议三、接口测试中接口规范四、项目合同新增业务介绍 4.1 登录接口调试 4.1 登录接口自动关联 4.1 添加课程接口调试 4.1 上传合同…

排序(前篇)

1.排序的概念及其运用 2.插入排序的概念及实现 3.希尔排序的概念及实现 4.选择排序概念及实现 总代码&#xff08;对比各个排序在大量的数据情况排序所化的时间&#xff09;&#xff1a; 1.排序的概念及其运用 1.1排序的概念 排序&#xff1a;所谓排序&#xff0c;就是使…

linux中逻辑卷管理与扩展

逻辑卷管理与扩展 逻辑卷 作用&#xff1a; 1.整合分散的空间2.空间支持扩大 逻辑卷制作过程&#xff1a;将众多的物理卷&#xff08;PV&#xff09;组建成卷组&#xff08;VG&#xff09;&#xff0c;再从卷组中划分出逻辑卷&#xff08;LV&#xff09; 逻辑卷的逻辑思路 …

前端项目开发,3个HTTP请求工具

这一小节&#xff0c;我们介绍一下前端项目开发中&#xff0c;HTTP请求会用到的3个工具&#xff0c;分别是fetch、axios和js-tool-big-box中的jsonp请求。那么他们都有哪些小区别呢&#xff1f;我们一起来看一下。 目录 1 fetch 2 axios 3 js-tool-big-box 的 jsonp 请求 …

一个月速刷leetcodeHOT100 day13 二叉树结构 以及相关简单题

树是一种分层数据的抽象模型 二叉树 二叉树中的节点最多只能有两个子节点&#xff0c;一个是左侧子节点&#xff0c;另一个是右侧子节点 二叉搜索树 二叉搜索树&#xff08;BST&#xff09;是二叉树的一种&#xff0c;但是只允许你在左侧节点存储&#xff08;比父节点&…

扎气球最高分-第13届蓝桥杯选拔赛Python真题精选

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第74讲。 扎气球最高分&…

IntelliJ IDEA内置自带Maven的使用注意事项

一、内置自带Maven的位置 IDEA中是有自带Maven的,虽然可能不够个性化,不太好用,但是如果知道怎么设置,还是能自定义一点的。它作为IDEA的自带插件,位置在IDEA所在目录的“\plugins\plugins\maven\lib\maven3\”文件夹中。 二、本地仓库位置 因为Maven主要功能就是统一下…

MoE模型大火,源2.0-M32诠释“三个臭皮匠,顶个诸葛亮”!

文 | 智能相对论 作者 | 陈泊丞 近半年来&#xff0c;MoE混合专家大模型彻底是火了。 在海外&#xff0c;OpenAI的GPT-4、谷歌的Gemini、Mistral AI的Mistral、xAI的Grok-1等主流大模型都采用了MoE架构。而在国内&#xff0c;浪潮信息也刚刚发布了基于MoE架构的“源2.0-M3…