📫作者简介:小明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友好的代码。