【性能优化】JVM调优与写出JVM友好高效的代码

📫作者简介:小明java问道之路2022年度博客之星全国TOP3,专注于后端、中间件、计算机底层、架构设计演进与稳定性建设优化,文章内容兼具广度、深度、大厂技术方案,对待技术喜欢推理加验证,就职于知名金融公司后端高级工程师。

        

📫 热衷分享,喜欢原创~ 关注我会给你带来一些不一样的认知和成长。

        

🏆 2022博客之星TOP3 | CSDN博客专家 | 后端领域优质创作者 | CSDN内容合伙人

🏆 InfoQ(极客邦)签约作者、阿里云专家 | 签约博主、51CTO专家 | TOP红人、华为云享专家

        

🔥如果此文还不错的话,还请👍关注、点赞、收藏三连支持👍一下博主~ 


🍅 文末获取联系 🍅  👇🏻 精彩专栏推荐订阅收藏 👇🏻

专栏系列(点击解锁)

学习路线(点击解锁)

知识定位

🔥Redis从入门到精通与实战🔥

Redis从入门到精通与实战

围绕原理源码讲解Redis面试知识点与实战

🔥MySQL从入门到精通🔥

MySQL从入门到精通

全面讲解MySQL知识与企业级MySQL实战

🔥计算机底层原理🔥

深入理解计算机系统CSAPP

以深入理解计算机系统为基石,构件计算机体系和计算机思维

Linux内核源码解析

围绕Linux内核讲解计算机底层原理与并发

🔥数据结构与企业题库精讲🔥

数据结构与企业题库精讲

结合工作经验深入浅出,适合各层次,笔试面试算法题精讲

🔥互联网架构分析与实战🔥

企业系统架构分析实践与落地

行业最前沿视角,专注于技术架构升级路线、架构实践

互联网企业防资损实践

互联网金融公司的防资损方法论、代码与实践

🔥Java全栈白宝书🔥

精通Java8与函数式编程

本专栏以实战为基础,逐步深入Java8以及未来的编程模式

深入理解JVM

详细介绍内存区域、字节码、方法底层,类加载和GC等知识

深入理解高并发编程

深入Liunx内核、汇编、C++全方位理解并发编程

Spring源码分析

Spring核心七IOC/AOP等源码分析

MyBatis源码分析

MyBatis核心源码分析

Java核心技术

只讲Java核心技术

本文目录

本文导读

一、JVM调优

二、常用的JVM调优参数

三、调整堆大小和垃圾回收器

1、调整堆大小

2、调整垃圾回收器

四、使用逃逸分析创建对象

五、JVM友好的代码 

总结


本文导读

本文讲解JVM调优的步骤、常用的JVM调优参数,如何调整堆大小和垃圾回收器,以及写出JVM友好的代码。

一、JVM调优

JVM调优涉及到两个概念:吞吐量和响应时间。jvm调优主要是针对他们进行调整优化,达到一个理想的目标,根据业务确定目标是吞吐量优先还是响应时间优先。

吞吐量:用户代码执行时间/(用户代码执行时间+GC执行时间)。

响应时间:整个接口的响应时间(用户代码执行时间+GC执行时间),stw时间越短,响应时间越短。 

调优步骤:1、熟悉业务场景,了解当前业务系统的要求,是吞吐量优先还是响应时间优先;2、选择合适的垃圾回收器组合,如果是吞吐量优先,则选择ps+po组合;如果是响应时间优先,在1.8以后选择G1,在1.8之前选择ParNew+CMS组合;3、大致的规划内存需求、CPU选择;4、根据实际情况设置升级年龄(最大年龄为15);5、设定 JVM/GC 参数。

二、常用的JVM调优参数

常用的JVM调优选项包括:
-Xms<size>:设置堆的初始大小。
-Xmx<size>:设置堆的最大大小。

-XX:NewSize=<size>:设置年轻代的初始大小。
-XX:MaxNewSize=<size>:设置年轻代的最大大小。
-XX:SurvivorRatio=<ratio>:设置年轻代中Eden区和Survivor区的比例。

-XX:PermSize=<size>:设置持久代的初始大小。
-XX:MaxPermSize=<size>:设置持久代的最大大小。

-XX:+UseConcMarkSweepGC:使用CMS垃圾回收器。
-XX:+UseParallelGC:使用并行垃圾回收器。
-XX:+UseG1GC:使用G1垃圾回收器。

三、调整堆大小和垃圾回收器

1、调整堆大小

堆大小是JVM在启动时分配的内存大小。如果堆太小,应用程序可能会发生OutOfMemoryError;如果堆太大,应用程序可能会因为频繁的垃圾回收而变得缓慢。

// 设置堆的初始大小为512MB,最大大小为1GB
java -Xms512m -Xmx1g// 设置堆的初始大小为1GB,最大大小为2GB
java -Xms1g -Xmx2g// 设置堆的初始大小为2GB,最大大小为4GB
java -Xms2g -Xmx4g

2、调整垃圾回收器

// 使用串行垃圾回收器(单线程,适合于小型应用程序)
java -XX:+UseSerialGC// 使用并行垃圾回收器
// (多线程,适合用于大型/多核CPU的应用程序)
java -XX:+UseParallelGC// 使用并发垃圾回收器
// (多线程,同时允许应用程序继续运行,适用于需要短暂停顿时间的大型应用程序)
java -XX:+UseConcMarkSweepGC// 使用G1垃圾回收器
// (多线程,将堆分成多个区域可以根据应用程序的实际情况调整垃圾回收的频率和时间
// 适合于需要高可预测性和低延迟的大型应用程序。)
java -XX:+UseG1GC

四、使用逃逸分析创建对象

逃逸分析是JVM在编译时分析Java程序中对象的作用域的过程。如果JVM可以确定对象的作用域仅限于当前方法或线程,那么JVM可以将对象分配在堆栈上而不是堆上。在堆栈上分配对象比在堆上分配对象更快,因为在堆上分配对象需要进行垃圾回收。

五、JVM友好的代码 

1、避免使用同步块和锁

2、尽可能使用局部变量

3、尽量减少对变量的重复计算(list.size())

4、尽量采用懒加载的策略,即在需要的时候才创建

5、异常不应该用来控制程序流程

6、不要将数组声明为public static final(无意义,数组的内容还是可以随意改变的)

7、不创建不使用的对象,不要 import 不使用的类

8、避免使用反射(通过反射加载的类在项目启动的时候)

9、使用数据库连接池和线程池(避免频繁地打开和关闭连接、创建和销毁线程)

10、容器初始化时尽可能指定长度(避免扩容)

11、避免显式GC(System.gc(),full gc)

总结

本文讲解JVM调优的步骤、常用的JVM调优参数,如何调整堆大小和垃圾回收器,以及写出JVM友好的代码。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

U-boot(四):start_armboot

本文主要探讨210的uboot启动的第二阶段&#xff0c;主要函数为start_armboot。 uboot 一阶段初始化SoC内部部件(看门狗、时钟等),初始化DDR,重定位 二阶段初始化其余硬件(iNand、网卡芯片)以及命令、环境变量等 启动打印硬件信息,进入bootdelay,读秒完后执行bootc…

2002-2020年341个地级市农业保险收入数据

2002-2020年341个地级市农业保险收入数据 1、时间&#xff1a;2002-2020年 2、范围&#xff1a;341个地级市 3、指标&#xff1a;农业保险收入 4、来源&#xff1a;整理自wind、保险年鉴 5、指标解释&#xff1a; 农业保险保费收入是指保险公司从农户或农业生产经营者那里…

使用Arrays.Sort并定制Comparator排序解决合并区间

合并区间-力扣算法题56题 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#xff0c;该数组需恰好覆盖输入中的所有区间 。 示例 1&#xff1a; 输入&am…

rabbit MQ的延迟队列处理模型示例(基于SpringBoot死信模式)

说明&#xff1a; 生产者P 往交换机X&#xff08;typedirect&#xff09;会发送两种消息&#xff1a;一、routingKeyXA的消息&#xff08;消息存活周期10s&#xff09;&#xff0c;被队列QA队列绑定入列&#xff1b;一、routingKeyXB的消息&#xff08;消息存活周期40s&#xf…

uboot中nfs和tftp方式获取文件

NFS文件系统挂载 服务器端配置如下 1.Server端需要安装NFS服务&#xff1a; sudo apt-get install nfs-kernel-server2.创建需要挂载的路径&#xff1a; mkdir -p /home/workspace/mercury/nfs_path3.创建共享目录&#xff1a; ①vim /etc/exports ②在文件中添加&#xff…

Vue3 封装组件库并发布到npm仓库

一、创建 Vue3 TS Vite 项目 输入项目名称&#xff0c;并依次选择需要安装的依赖项 npm create vuelatest 项目目录结构截图如下&#xff1a; 二、编写组件代码、配置项和本地打包测试组件 在项目根目录新建 package 文件夹用于存放组件 &#xff08;以customVideo为例&a…

在 CentOS 7 上安装 MySQL 8

在 CentOS 7 上安装 MySQL 8 步骤 1: 添加 MySQL Yum 存储库 首先&#xff0c;我们需要添加 MySQL Yum 存储库。打开终端并执行以下命令&#xff1a; sudo yum install -y https://repo.mysql.com/mysql80-community-release-el7-3.noarch.rpm步骤 2: 导入 MySQL GPG 公钥 …

Redis报错:JedisConnectionException: Could not get a resource from the pool

1、问题描述&#xff1a; redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool 2、简要分析&#xff1a; redis.clients.util.Pool.getResource会从JedisPool实例池中返回一个可用的redis连接。分析源码可知JedisPool 继承了 r…

爱奇艺的再进化:好内容强化溢出效应,会员长期价值凸显

作为长视频行业率先探索业绩良性成长路径的玩家&#xff0c;爱奇艺每一次的业绩质量&#xff0c;始终是观摩行业发展状态不可或缺的参照物。继历史最佳二季度之后&#xff0c;11月21日晚间&#xff0c;爱奇艺发布2023年第三季度业绩&#xff0c;再度强势打出原创内容高质量发展…

Arm64版本的centos编译muduo库遇到的问题的归纳

环境&#xff1a;Mac m2 pro下的VMware虚拟机中Arm64 centos ./build.sh 执行后提示如下 cmake -DCMAKE_BUILD_TYPErelease -DCMAKE_INSTALL_PREFIX…/release-install-cpp11 -DCMAKE_EXPORT_COMPILE_COMMANDSON /root/package/muduo-master – Boost version: 1.69.0 – Co…

机器学习/sklearn笔记:MeanShift

1 算法介绍 一种基于质心的算法通过更新候选质心使其成为给定区域内点的均值候选质心的位置是通过一种称为“爬山”技术迭代调整的&#xff0c;该技术找到估计的概率密度的局部最大值 1.1 基本形式 给定d维空间的n个数据点集X&#xff0c;那么对于空间中的任意点x的均值漂移…

稻谷飘香金融助力——建行江门市分行助力乡村振兴

7月的台山&#xff0c;稻谷飘香。在大耕户李胜业的农田里&#xff0c;金灿灿的稻谷翻起层层稻浪&#xff0c;收割机在稻浪里来回穿梭&#xff0c;割稻、脱粒、装车等工序一气呵成。空气中弥漫着丰收的喜悦。 夏粮迎丰收的背后&#xff0c;是中国建设银行江门市分行&#xff08…