【性能优化】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.mzph.cn/news/164428.shtml

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

相关文章

面试:Kafka相关问题

文章目录 简单介绍kafkakafka应用场景为什么需要zookeeperZookeeper 对于 Kafka 的作用是什么&#xff1f;kafka高效的原因kafka的特点kafka的核心组成Kafka中的Topic和Partition有什么关系&#xff1f;Kafka的消费消息是如何传递的&#xff1f;Kafka 的多副本机制了解吗&#…

STM32:基本定时器原理和定时程序

一、初识定时器TIM 定时器就是计数器&#xff0c;定时器的作用就是设置一个时间&#xff0c;然后时间到后就会通过中断等方式通知STM32执行某些程序。定时器除了可以实现普通的定时功能&#xff0c;还可以实现捕获脉冲宽度&#xff0c;计算PWM占空比&#xff0c;输出PWM波形&am…

Vue3 + Vite + TSX + vue3-ace-editor 踩坑

前言 由于 ace-editor 官网并没有提供各个前端框架Vue&#xff0c;React&#xff0c;Angular的直接使用的适配版本&#xff0c; 所以本次使用的vue3-ace-editor 是个人开源者维护的版本&#xff0c;原生是支持 SFC 模版用的&#xff0c;由于我这里习惯使用 JSX 或 TSX的方式&a…

【03】ES6:解构赋值

一、数组的解构赋值 ES6 允许按照一定模式&#xff0c;从数组和对象中提取值&#xff0c;对变量进行赋值&#xff0c;这被称为解构&#xff08;Destructuring&#xff09;。 1、基本使用 遵循 “模式匹配” &#xff0c;索引值相同的完成赋值 // 为变量赋值&#xff0c;只能…

Centos7 Python环境和yum修复

1、删除现有残余包 [rootlocalhost ]# rpm -qa|grep python|xargs rpm -ev --allmatches --nodeps[rootlocalhost ]# rpm -qa|grep yum|xargs rpm -ev --allmatches --nodeps[rootlocalhost ]# whereis python |xargs rm -frv[rootlocalhost ]# whereis python ##验证清除&…

mybatis注解方式动态标签时有特殊符号,出现元素内容必须由格式正确的字符数据或标记组成

原始代码demo Select("SELECT COUNT(1) FROM AAAA WHERE name #{nage} AND age< 4") public Integer sumXxxxx(String nage, String age);现需求改为nage可以为空&#xff0c;因此使用了动态拼接 Select("<script> SELECT COUNT(1) FROM AAAA WHERE …

SWT/Jface(2): 表格的编辑

前言 上节说到, 创建和渲染表格需要如下几个步骤: 接收源数据数组(也可以是单个对象或者其他集合类型): TableViewer.setInput(Object)渲染接收的数据 渲染表头: TableViewer.setLabelProvider(IBaseLabelProvider)渲染内容: TableViewer.setContentProvider(IContentProvide…

java.lang.IllegalArgumentException: java.net.UnknownHostException: xxx

windows系统下连接hdfs进行操作时&#xff0c;上来就出现java.lang.IllegalArgumentException: java.net.UnknownHostException: xxx java.lang.IllegalArgumentException: java.net.UnknownHostException: liujianat org.apache.hadoop.security.SecurityUtil.buildTokenServ…

Keil Vision5—新建工程project

注意&#xff1a;创建的工程目录必须是纯英文目录 目录 1.开始配置 2.为该路径下新建个文件夹 3.选择器件 4.工程配置 4.右击魔术棒&#xff0c;设置参数 ​编辑 &#xff08;1&#xff09;target配置 &#xff08;2&#xff09;output配置 &#xff08;3&#xff09;c…

字符串结尾空格比较相关参数BLANK_PAD_MODE(DM8:达梦数据库)

DM8:达梦数据库 字符串结尾空格比较相关参数BLANK_PAD_MODE 环境介绍1 BLANK_PAD_MODE01.1 初始化数据库1.2 创建测试表 T0 2 BLANK_PAD_MODE12.1 初始化数据库2.2 创建测试表 T1 3 BLANK_PAD_MODE只对字段varchar类型生效3.1 BLANK_PAD_MODE 对char 类型对比无效3.2 在两个数据…

计算机中了halo勒索病毒怎么清除,halo勒索病毒解密数据恢复

科技的进步加快了企业发展的步伐&#xff0c;网络技术的不断应用为企业的生产运营提供了极大帮助&#xff0c;但随之而来的网络安全威胁也不断增加&#xff0c;近期&#xff0c;云天数据恢复中心接到很多企业的求助&#xff0c;企业的计算机服务器遭到了halo勒索病毒攻击&#…

Jmeter快速入门

文章目录 1.安装Jmeter1.1.下载1.2.解压1.3.运行 2.快速入门2.1.设置中文语言2.2.基本用法 1.安装Jmeter Jmeter依赖于JDK&#xff0c;所以必须确保当前计算机上已经安装了JDK&#xff0c;并且配置了环境变量。 1.1.下载 可以Apache Jmeter官网下载&#xff0c;地址&#xf…

uni-app打包后,打开软件时使其横屏显示

找到page.json文件&#xff0c;在global加入以下代码&#xff1a; 这样就可以横屏显示了。

CANdelaStudio 使用教程 1

文章目录 CANdelaStudio 软件下载CANdelaStudio 软件的权限View Edition 和 Admin Edition 区别&#xff1a;打开文件 CDD / CDDT 文件新建 CDD 文件新建 CDDT 文件CDD 和 CDDT 文件的区别 CANdelaStudio 软件下载 1、 来到 Vector 官网下载中心 https://www.vector.com/cn/zh…

[shader] 光照入门(未完结。。。

反射 漫反射&#xff1a;而当物体表面粗糙时&#xff0c;我们把物体表面看作无数不同方向的微小镜面&#xff0c;则这些镜面反射出的光方向均不相同&#xff0c;这就是漫反射。 高光反射&#xff1a;我们假定物体表面光滑&#xff0c;只有一个镜面&#xff0c;那么所有的光都…

报错For debugging consider passing CUDA_LAUNCH_BLOCKING=1.

.报错For debugging consider passing CUDA_LAUNCH_BLOCKING1. /aten/src/ATen/native/cuda/NLLLoss2d.cu:103: nll_loss2d_forward_kernel: block: [29,0,0], thread: [707,0,0] Assertion t > 0 && t < n_classes failed. 报错信息如下&#xff1a; ./aten/…

力扣labuladong——一刷day46

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、力扣971. 翻转二叉树以匹配先序遍历二、力扣987. 二叉树的垂序遍历三、力扣666. 路径总和 IV 前言 二叉树的递归分为「遍历」和「分解问题」两种思维模式&a…

面试:RocketMQ相关问题

文章目录 什么是 RocketMQ&#xff0c;有哪些使用场景&#xff1f;RocketMQ 由哪些⻆色组成&#xff0c;每个⻆色作用和特点是什么&#xff1f;RocketMQ 中的 Topic 和 JMS 的 queue 有什么区别&#xff1f;RocketMQ 消费模式有几种&#xff1f;RocketMQ 的 Consumer 是如何消费…

【深度学习】Python快捷调用InsightFace人脸检测,纯ONNX推理

pypi资料&#xff1a; https://pypi.org/project/insightface/ 模型选择&#xff1a; https://github.com/deepinsight/insightface/tree/master/python-package#model-zoo onnxruntime的GPU对应CUDA &#xff1a; https://onnxruntime.ai/docs/reference/compatibility …

1999-2021年地级市城镇居民人均消费性支出数据

1999-2021年地级市城镇居民人均消费性支出数据 1、时间&#xff1a;1999-2021年 2、指标&#xff1a;城镇居民人均消费性支出 3、范围&#xff1a;290个地级市 4、来源&#xff1a;城市年鉴、地级市统计公报 5、指标解释&#xff1a; 城镇居民人均消费性支出&#xff1a;指…