个人感觉不错的文章
-
jvm调优
2021-04-09 22:47:40 -
JVM调优
2019-09-26 16:23:141 JVM调优总结-序 2 JVM调优总结(一)-- 一些概念 3 JVM调优总结(二)-一些概念 3 JVM调优总结(三)-基本垃圾回收算法 4 JVM调优总结(四)-垃圾回收面临的问题 5 JVM调优总结(五)-分代垃圾回收详述1 6 ...转载于:https://www.cnblogs.com/kitor/p/11342073.html
-
JVM调优实践:记录初次JVM调优经历
2021-03-08 14:54:45JVM调优实践:记录初次JVM调优经历前言JVM调优工具参考文章初步调优基本指令选择垃圾收集器初步确定堆大小 前言 之前关于 JVM 调优大部分都只是一些理论依据,具体经验没有,这回正好记录下。 中间一些碰壁与返工的...JVM调优实践:记录初次JVM调优经历
前言
之前关于 JVM 调优大部分都只是一些理论依据,具体经验没有,这回正好记录下。
中间一些碰壁与返工的部分就跳过了。
GC 调优准则
- GC优化是到最后不得已才采用的手段
- 多数导致GC问题的Java应用,我们应该尝试优化代码,减少大对象与全局变量的创建,减少创建的对象数量。
- 在应用上线之前,先考虑将机器的JVM参数设置到最优(就是我现在干的)
- 在实际使用中,分析GC情况优化代码比优化GC参数要多得多
GC 调优目的
- 减少从新生代进入老年代的对象数量
- 减少 Full GC 的执行时间与频率
关于 GC 频率
- Minor GC执行的很快(小于50ms)
- Minor GC执行的并不频繁(大概10秒一次)
- Full GC执行的很快(小于1s)
- Full GC执行的并不频繁(10分钟一次)
JVM调优工具
-
jps: 用来显示本地的java进程,可以查看本地运行着几个java程序,并显示他们的进程号。
-
jinfo: 可以根据进程号输出并修改运行时的java 进程的opts。
-
jstat: 一个极强的监视VM内存工具。可以用来监视VM内存内的各种堆和非堆的大小及其内存使用量。
-
jmap: 打印出某个java进程(使用pid)内存内的所有’对象’的情况(如:产生那些对象,及其数量)。
-
jstack: 用于查询线程的使用情况,以及帮你快速找到死锁线程,以便快速定位问题。
-
jcmd: 全功能命令,是上面功能的集合,具体的可以看 help
-
jconsole: UI 查看,缺点线上你可能没法连,正式Dump太大,根本下不下来,因此能用命令学会用命令
-
jvisualvm: 同样是个 UI 查看器,缺点线上你可能没法连,正式Dump太大,根本下不下来,因此能用命令学会用命令
-
Arthas: 阿里巴巴出品的全链路追踪工具,功能强大,甚至可以热更新代码,推荐正式服用这个。Athas Gitee
参考文章
站在前人的肩膀上,必不可少
初步调优
基本指令
不管咋样我都会加的指令
- -XX:+PrintGCDetails: 打印 GC 信息
- -XX:+HeapDumpOnOutOfMemoryError: 出现 OOM 异常时,打印 dump
- -XX:HeapDumpPath=/root/: dump 存放位置,这是为了出现一些突发情况时,方便排查
选择垃圾收集器
深入理解 Java 虚拟机:JVM 中的 GC 垃圾收集器总结
垃圾收集器的选择首先需要了解垃圾收集器的特点,我这的项目属于哪种普通的网站项目,比起吞吐量,更加注重网站的响应速度,因此我这里选择的是 CMS 垃圾收集器,优点在于耗时较长的垃圾回收阶段可以与用户线程并发运行。缺点就不赘述了,多注意下。
- -XX:+UseConcMarkSweepGC: 启用 CMS 垃圾收集器
- -XX:+CMSParallelInitialMarkEnabled: 开启多线程并发进行标记,减少暂停时间
- -XX:+CMSScavengeBeforeRemark: 在重新标记前先执行一次新生代GC,GC可以回收掉一些新生代中没有再被引用的对象,然后重新标记阶段再进行扫描时,就可以少扫描一些对象,耗时自然就减少了,CMS重新标记阶段的性能也能因此提升。
- -XX:+UseCMSCompactAtFullCollection: 用于在 CMS 收集器 顶不住要进行 Full GC 时,开启内存碎片的合并整理过程,开关参数,默认开启,因此不专门加了。
初步确定堆大小的理论依据
根据推荐公式以及其它人的经验来看
- 总堆大小为,老年代在FGC情况下的3-4倍,取大点用FGC的4倍
- Sun官方建议年轻代的大小为整个堆的3/8左右
计算总堆与新生代大小
由于不知道该给多大堆,所以先给个足够大的值
-Xmx1024m -Xms1024m
本地启动项目
定位进程号
利用jmap -histo:live <pid>
打印每个class的实例数目,内存占用,类全名信息.live子参数加上后,只统计活的对象数量. 此时会触发FullGC,线上操作请注意,FGC会导致系统卡顿。接着利用
jmap -heap <pid>
查看目前堆栈信息
因此总堆计算:
67 x 4 = 268M,取整使用512M作为堆大小新生代:
512 x 3 / 8 = 192M命令:
-Xmx512m -Xms512m -Xmn192m查看下当前停顿时间
配置好VM后,重启项目
1000ms统计1次,共打印10次
jstat -gcutil <pid> 1000 10
停顿时间公式:
YGC平均耗时(毫秒/次) = YGCT(秒)/ YGC(次数)x 1000
FGC平均耗时(毫秒/次) = FGCT(秒)/ FGC(次数)x 1000YGC平均耗时:0.153 / 16 x 1000 = 9.56(ms)
FGC平均耗时:0.052 / 4 x 1000 = 13(ms)Jconsole 观察下
本地用 Jconsole 看下情况,命令行执行
jconsole
,出来图形化界面后,选择要观察的进程
从图形上来看还算并没有什么异常,中间波动是我不小心断开重连导致的
整体上看没啥问题,上线测试服看看。 -
JVM 调优系列 1:“精通 JVM 调优,有过 JVM 调优经验”,简历敢写吗?薪资涨 5k 的技巧!
2021-03-15 13:54:05现在除了一些有工作和开发经验的大神,基本很少有人在简历上敢写“精通 JVM 调优,有过 JVM 调优经验”,因为应聘者如果写这句话就意味着你的面试将会是很“难过”的,面试官会变着法的问你如何进行 JVM 系列调优,...文章目录
前言
现在除了一些有工作和开发经验的大神,基本很少有人在简历上敢写“精通 JVM 调优,有过 JVM 调优经验”,因为应聘者如果写这句话就意味着你的面试将会是很“难过”的,面试官会变着法的问你如何进行 JVM 系列调优,如果你的基础比较薄弱或者是仅仅背面试题速成,那么你很可能在面试中露馅。JVM 作为 Java 的核心,面试后端开发工程师或者架构师这都是必备的技能。既然 JVM 如此重要,那我就在本系列中完整的过一遍,让你敢于在简历上写“精通 JVM 调优,有过 JVM 调优经验”,薪资涨 5k!
在聊 JVM 调优和 GC 之前,我们先看看当下就业环境中面试对于 JVM 和 GC 的一些相关面试题,看看企业开发岗需要什么样的人才。
一、部分大厂对于 JVM GC 的面试题
说明:以下数据来源于 2019~2020 年一些大厂的面试题。
1.1、百度
- CMS 和 G1 的异同。
- G1 什么时候引发 FullGC?
- 说一个最熟悉的垃圾回收算法。
- 吞吐量优先和响应时间优先的回收器有哪些?
1.2、顺丰
- 怎么判断内存泄漏?
- 讲一下 CMS 的流程。
1.3、京东
- 为什么压缩指针超过 32G 失效?
1.4、淘宝
- 什么是内存泄漏?GC 调优有经验吗?一般出现 GC 问题你怎么解决?
1.5、阿里、蘑菇街
- ThreadLocal 有没有内存泄漏问题?
- G1 两个 Region 不是连续的,而且之间还有可达的引用,我现在要回收一个,另一个怎么处理?
- 讲一下 JVM 堆内存管理(对象分配过程)。
- 听说过 CMS 的并发预处理和并发可中断预处理吗?
- 到底多大的对象会被直接扔到老年代?
看了面试题,作何感想?可能有人觉得简单,有人一知半解,听过但是不会。不要急!我们慢慢来。
二、Garbage Collectors(GC)作何使用
首先我们都知道,在 Java 当中,我们在创建一个对象之后,就可以无需再去管它,该对象不被使用变成一个垃圾之后,谁去进行处理?Garbage Collectors(垃圾回收器)。
备注:后续文章内容 Garbage Collectors 皆用 GC 代替。
三、GC 的十种类型
JVM 作为 Java 的枢纽,管理着全部的内存,而对于内存的分配和回收就是由垃圾回收器来控制。
从 JVM 的诞生到现在 2021 年,一共产生过十种类型的垃圾回收器,如下图所示:
这里呢大家可以对这十种垃圾回收器仅作了解,我们将会在后续的章节中一一为大家介绍。四、JVM 的版本参数信息
现在企业开发绝大多数使用的版本为 1.8。我本地的开发版本也是 1.8,我们就通过该版本来进行演示。
如果我们直接将程序部署到 JVM 上,没有做过任何调优动作,1.8 版本的默认 GC 为 Parallel。可能有人会有疑问:如何查看开发环境下 JVM 默认的 GC 版本信息呢?别急,往下看。
首先我们来认识以下几个命令,我们打开 CMD 命令界面。
4.1、查看 Java 启动时所有默认的命令行参数
输入以下 Shell 命令:
java -XX:+PrintCommandLineFlags
这是我们就可以看到打印出的 Java 启动时所有默认的命令行参数,如下图所示:
4.2、查看 Java 启动时 GC 的参数信息
如果只需要查看本地环境下的 GC 参数信息,我们输入如下 Shell 命令即可:
java -XX:+PrintCommandLineFlags -version
我们可以从控制台的返回信息得知,1.8.0_251-b08 版本所对应的默认 GC 为 Parallel,如下图所示:
五、GC 的分代模型与分区模型
上面我们已经说到,内存的分配和回收就是由垃圾回收器来控制。
我们将 GC 的使用分为两大类,分别是:分代模型和分区模型。
- 分代模型:两个垃圾回收器混合控制系统中的垃圾回收。
- 分区模型:不再分代,一个垃圾回收器就足够。
在本节中我们将着重对分代模型进行介绍。
5.1、分代模型
分代模型将内存分为两个大的部分,新生代和老年代。
如下图所示,左半部分为新生代,右半部分为老年代:
新生代和老年代所对应的回收算法应用:- 新生代大量死去,少量存活,采用复制算法。
- 老年代存活率高,回收较少,采用MC或MS。
5.1.1、新生代
刚刚诞生的的对象为“新生”,存放在新生代区域里面。随着程序的运行,大部分“新生对象”被垃圾回收。
5.1.2、老年代
垃圾回收器回收了多次没有回收掉的对象被称为“老年”,就被存放在老年代中。
在默认情况下 JDK 1.8 没有调参数、调优用的就是 GC 的分代模型。
总结
在本文中我们通过面试题知道了大厂开发对于 JVM 的要求,暂时了解在 JVM 中存在的十种 GC,学会如何查看本地开发环境默认的 GC,掌握了 GC 的两种使用方式,分代模型与分区模型,明白什么样的对象属于什么代,存放在内存中的什么位置。同时,在新生代和老年代中又会诞生各种各样的垃圾回收算法,我们将在下一小节讲解。
我是白鹿,一个不懈奋斗的程序猿。望本文能对你有所裨益,欢迎大家的一键三连!若有其他问题、建议或者补充可以留言在文章下方,感谢大家的支持!
-
JVM 调优指标、JVM 日志、JVM 调优工具
2020-08-10 12:13:46文章目录参考JVM 调优指标JVM 日志JVM 调优工具 参考 https://blog.csdn.net/weixin_42447959/article/details/81637909 JVM 调优指标 内存占用:程序正常运行需要的内存大小。 延迟:由于垃圾收集而引起的程序停顿... -
JVM调优思路、订单秒杀jvm调优案例
2020-09-07 12:34:00jvm调优思路2. 订单的秒杀模块jvm调优案例 1. jvm调优思路 jvm调优其实更多的是对GC的优化,尤其是尽量减少full GC。 &... -
jvm调优工具_JVM调优 调优工具以及调优方法
2020-12-03 16:20:16来源:https://www.iteye.com/blog/pengjiaheng-5524561 JVM调优工具Jconsole,jProfile,VisualVM。Jconsole: jdk自带,功能简单,但是可以在系统有一定负荷的情况下使用。对垃圾回收算法有很详细的跟踪。JProfiler... -
JVM 调优
2020-12-23 19:09:50题记-------JVM 调优分类及思路: 调优是一个很大的概念,简单说就是把系统进行优化,但是站在一个系统的角度,能够干的事情太多了,一般调优的思路可以是“测试 - 分析 - 调优”三步走。任何调优一般都需要结合场景... -
深入浅出JVM调优,看完你就懂
2019-08-12 13:50:52深入浅出JVM调优 基本概念: JVM把内存区分为堆区(heap)、栈区(stack)和方法区(method)。由于本文主要讲解JVM调优,因此我们可以简单的理解为,JVM中的堆区中存放的是实际的对象,是需要被GC的。其他的都无需GC。 ... -
jvm 调优
2019-09-18 11:35:13-Xms1024m -Xmx1024m -XX:+PrintGCDetails jvm 调优