JVM之性能优化

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性能优化指南

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

STM32-GPIO八种输入输出模式

图片取自 江协科技 STM32入门教程-2023版 细致讲解 中文字幕 p5 【STM32入门教程-2023版 细致讲解 中文字幕】 https://www.bilibili.com/video/BV1th411z7sn/?p5&share_sourcecopy_web&vd_source327265f5c70f26411a53a9226af0b35c 目录 ​编辑 一.STM32的四种输…

5个免费下载音乐的网站,喜欢听什么就搜什么

以下5个音乐下载网站&#xff0c;中国人不骗中国人&#xff0c;全部免费。个个曲库丰富&#xff0c;喜欢听什么就搜什么&#xff0c;还能下载mp3格式&#xff0c;点赞收藏即刻拥有&#xff01; 1、MyFreeMP3 tools.liumingye.cn/music/ MyFreeMP3是一个提供音乐播放和下载服…

微信加好友的方式有哪些?如何快捷自动回复?

微信加好友的方式&#xff1a; 1、通信录导入根据微信号综合评分&#xff0c;24小时只能加15-25位好友。即使超出了25个&#xff0c;添加后显示发送验证成功&#xff0c;对方也收不到你的验证信息&#xff0c;你手上有千万个老客户的手机号也没用。 2、查找添加10小时智能查找…

Leecode热题100---二分查找--4:寻找两个正序数组的中位数

题目&#xff1a; 给定两个大小分别为 m 和 n 的正序&#xff08;从小到大&#xff09;数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 解法1、暴力解法&#xff08;归并&#xff09; 思路&#xff1a; 合并 nums1&#xff0c;nums2 为第三个数组 排序第三个数…

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 次。最大…

Linux: network: tcp spurious retrans 的一个原因

最近分析问题的时候&#xff0c;从wireshark里看有&#xff1a;tcp spurious retrans 的包&#xff0c;309这个是307 的retransmission&#xff0c;而且在308 回复了ACK。那为什么会重传&#xff1f; 从网上找了一些&#xff0c;比如 https://www.packetsafari.com/blog/2021…

IEEE Latex模版踩雷避坑指南

参考文献 原Latex模版 \begin{thebibliography}{1} \bibliographystyle{IEEEtran}\bibitem{ref1} {\it{Mathematics Into Type}}. American Mathematical Society. [Online]. Available: https://www.ams.org/arc/styleguide/mit-2.pdf\bibitem{ref2} T. W. Chaundy, P. R. Ba…

IO系列(十) -TCP 滑动窗口原理解析

一、摘要 之前在知乎上分享网络编程知识文章的时候&#xff0c;有个网友私信给我留言了一条“能不能写一篇关于 TCP 滑动窗口原理的文章”。 当时没有立即回复&#xff0c;经过查询多方资料&#xff0c;发现这个 TCP 真的非常非常的复杂&#xff0c;就像一个清澈的小沟&#…

Java版招投标管理系统源码:优化流程,提升效率,实现全方位项目管理

在现今日益竞争激烈的招标市场中&#xff0c;企业需要一款强大而灵活的招投标管理系统来优化流程、提升效率。我们的招投标管理系统正是为此而生&#xff0c;它集门户管理、立项管理、采购项目管理、公告管理、考核管理、报表管理、评审管理、企业管理、采购管理和系统管理等多…

使用 MySQL 触发器 + 统计学生表实时计算表数据量

要使用 MySQL 触发器实时计算表数据量&#xff0c;您可以创建一个触发器&#xff0c;当插入、更新或删除学生表的数据时&#xff0c;触发器就会更新另一个表中保存的学生表数据量信息。以下是一个示例&#xff1a; 首先&#xff0c;假设您有一个名为 students 的学生表&#x…

MS Excel: 高亮当前行列 - 保持原有格式不被改变

本文使用条件格式VBA的方法实现高亮当前行列&#xff0c;因为纯VBA似乎会清除原有的高亮格式。效果如下&#xff1a;本文图省事就使用同一种颜色了。 首先最重要的&#xff0c;【选中你期望高亮的单元格区域】&#xff0c;比如可以全选当前sheet的全部区域 然后点击【开始】-【…

【LeetCode算法】第94题:二叉树的中序遍历

目录 一、题目描述 二、初次解答 三、官方解法 四、总结 一、题目描述 二、初次解答 1. 思路&#xff1a;二叉树的中序遍历。访问二叉树的左子树&#xff0c;再访问二叉树的根节点&#xff0c;最后访问二叉树的右叉树。 2. 代码&#xff1a; void order(struct TreeNode* r…

JDBC使用步骤-小白入门

一.JDBC开发流程 加载并注册JDBC驱动创建数据库连接创建Statement对象遍历查询结果关闭连接,释放资源 import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement;public class StandardJDBCSample {public static …

基于python开发用于深度学习模型训练过程loss值曲线的平滑处理模块

深度学习网络模型的loss曲线是训练过程中非常重要的一个监控指标&#xff0c;它能够直观地反映模型的学习状态以及可能存在的问题。以下是对深度学习网络模型loss曲线的详细介绍&#xff1a; 一、loss曲线的基本概念 在深度学习的训练过程中&#xff0c;loss函数用于衡量模型…

23种设计模式之一— — — —装饰模式详细介绍与讲解

装饰模式详细讲解 一、定义二、装饰模式结构核心思想模式角色模式的UML类图应用场景模式优点模式缺点 实例演示图示代码演示运行结果 一、定义 装饰模式&#xff08;别名&#xff1a;包装器&#xff09; 装饰模式&#xff08;Decorator Pattern&#xff09;是结构型的设计模式…

【PB案例学习笔记】-12秒表实现

写在前面 这是PB案例学习笔记系列文章的第11篇&#xff0c;该系列文章适合具有一定PB基础的读者。 通过一个个由浅入深的编程实战案例学习&#xff0c;提高编程技巧&#xff0c;以保证小伙伴们能应付公司的各种开发需求。 文章中设计到的源码&#xff0c;小凡都上传到了gite…

云原生架构内涵_3.主要架构模式

云原生架构有非常多的架构模式&#xff0c;这里列举一些对应用收益更大的主要架构模式&#xff0c;如服务化架构模式、Mesh化架构模式、Serverless模式、存储计算分离模式、分布式事务模式、可观测架构、事件驱动架构等。 1.服务化架构模式 服务化架构是云时代构建云原生应用的…

【Java用法】java中计算两个时间差

java中计算两个时间差 不多说&#xff0c;直接上代码&#xff0c;可自行查看示例 package org.example.calc;import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit;public class MinusTest {public static void…

迅睿CMS邮箱设置QQ邮箱为例

邮箱设置 1、服务器地址两个&#xff0c;普通与企业。 普通&#xff1a;ssl://smtp.qq.com企业&#xff1a;ssl://smtp.exmail.qq.com 2、端口号为&#xff1a;465 3、邮箱账号&#xff1a;填写自己的QQ邮箱作为发布服务器。 4、邮箱密码&#xff1a;到QQ邮箱账号中获取“…

c++编程(15)——list的模拟实现

欢迎来到博主的专栏——c编程 博主ID&#xff1a;代码小豪 文章目录 前言list的数据结构list的默认构造尾插与尾删iterator插入和删除构造、析构、赋值copy构造initializer_list构造operator 析构函数 前言 受限于博主当前的技术水平&#xff0c;暂时还不能模拟实现出STL当中用…