京东面试:如何进行JVM调优?

JVM 调优是一个很大的话题,在回答“如何进行 JVM 调优?”之前,首先我们要回答一个更为关键的问题,那就是,我们为什么要进行 JVM 调优?

只有知道了为什么要进行 JVM 调优之后,你才能准确的回答出来如何进行 JVM 调优?

要进行 JVM 调优无非就是以下两种情况:

  1. 目标驱动型的 JVM 调优,如,我们是为了最短的停顿时间所以要进行 JVM 调优,或者是我们为了最大吞吐量所以要进行 JVM 调优等。
  2. 问题驱动型的 JVM 调优,因为生产环境出现了频繁的 FullGC 了,导致程序执行变慢,所以我们要进行 JVM 调优。

所以,针对不同的 JVM 调优的手段和侧重点也是不同的。

总的来说,JVM 进行调优的流程如下:

  1. 确定 JVM 调优原因
  2. 分析 JVM(目前)运行情况
  3. 设置 JVM 调优参数
  4. 压测观测调优后的效果
  5. 应用调优后的配置

具体来说它们的执行如下。

1.确定JVM调优原因

先确定是目标驱动型的 JVM 调优,还是问题驱动型的 JVM 调优。

如果是目标性的 JVM 调优,那么 JVM 调优实现思路就比较简单了,如:

  1. 以最短停顿时间为目标的调优,只需要将垃圾收集器设置成以最短停顿时间的为目标的垃圾收集器即可,如 CMS 收集器或 G1 收集器。
  2. 以吞吐量为目标的调优,只需要将垃圾收集器设置为 Parallel Scavenge 和 Parallel Old 这种以吞吐量为主要目标的垃圾回收器即可。

如果是以问题驱动的 JVM 调优,那就要先分析问题是什么,然后再进行下一步的调优了。

2.分析JVM运行情况

我们可以借助于目前主流的监控工具 Prometheus + Grafana 和 JDK 自带的命令行工具,如 jps、jstat、jinfo、jstack 等进行 JVM 运行情况的分析。

主要分析的点是 Young GC 和 Full GC 的频率,以及垃圾回收的执行时间。

3.设置JVM调优参数

常见的 JVM 调优参数有以下几个:

  • 调整堆内存大小:通过设置 -Xms(初始堆大小)和 -Xmx(最大堆大小)参数来调整堆内存大小,避免频繁的垃圾回收。
  • 选择合适的垃圾回收器:根据应用程序的性能需求和特点,选择合适的垃圾回收器,如 Serial GC、Parallel GC、CMS GC、G1 GC 等。
  • 调整新生代和老年代比:通过设置 -XX:NewRatio 参数来调整新生代和老年代的比例,优化内存分配。
  • 设置合适的堆中的各个区域比例:通过设置 -XX:SurvivorRatio 参数和 -XX:MaxTenuringThreshold 参数来调整 Eden 区、Survivor 区和老年代的比例,避免过早晋升和过多频繁的垃圾回收。
  • 设置对象从年轻代进入老年代的年龄值:-XX:InitialTenuringThreshold=7 表示 7 次年轻代存活的对象就会进入老年代。
  • 设置元空间大小:在 JDK 1.8 版本中,元空间的默认大小会根据操作系统有所不同。具体来说,在 Windows 上,元空间的默认大小为 21MB;而在 Linux 上,其默认大小为 24MB。然而如果元空间不足也有可能触发 Full GC 从而导致程序执行变慢,因此我们可以通过 -XX:MaxMetaspaceSize= 设置元空间的最大容量。

4.压测观测调优后的效果

JVM 参数调整之后,我们要通过压力测试来观察 JVM 参数调整前和调整后的差别,以确认调整后的效果。

5.应用调优后的配置

在确认了 JVM 参数调整后的效果满足需求之后,就可以将 JVM 的参数配置应用与生产环境了。

课后思考

除了以上常见的 JVM 调优参数之外,还有没有其他重要的参数设置呢?

参考 & 鸣谢

javacn.site

#java##八股文#
Java面试精讲 文章被收录于专栏

Java常见面试题、场景题、企业真题精讲。

全部评论
热乎的
点赞 回复 分享
发布于 2024-05-21 20:23 山东

相关推荐

09-11 19:58
门头沟学院 Java
项目拷打 1.谈谈对整个rpc远程调用的一些理解2.rpc框架的缓存层的更新策略和过期逻辑是怎么样的?(过期机制没有实现(踩雷))3.zookeeper回调失败了怎么办呢?(没有考虑到)4.你有了解过zookeeper大概能抗多少qps(不知道,就随便猜了个数比如1万)5.你还了解其他的一些服务发现的中间件它们的管理服务注册与发现的一些方法吗(简单说了nacos的轮询)6.说一下不同序列化协议的一些差别,以及为什么一个rpc框架为什么要那么多的序列化协议7.继续第6题,那么我们线上技术选型的时候该怎么去选这些序列化协议8.你本地缓存里的缓存数据是什么格式的(面试官补充:你存的这个value是通过json序列化缓存到本地的,还是对象本身缓存到本地的,还是通过一些压缩方式)9.假如说如果通过不同的序列化格式缓存到本地的话,他们的区别是什么(面试官补充除了这个还有什么深层次的区别以及应用上考虑的因素)?(这里我答的太唐了,直接说内容是不一样的)10.对微服务的理解你能谈一谈吗?11.既然微服务那么好,为什么还会有单体架构设计的存在呢(从软件体系结构上来讲)?(此处懵逼,我直接说易于开发,性价比高)12.微服务的一些劣势是什么呢及它的一些痛点?(从我的角度出发)13.我看你项目中聊到负载均衡,你能讲讲在计算机网络中(4层模型和7层模型的在负载均衡的区别或者应用上的区别)?### 八股拷打jvm调优你有什么思路吗 ?启动jvm的时候,可以指定一些jvm参数,那你怎么设置呢?OOM(内存溢出)有那些常见的场景呢?以及分别的解决方案大概是怎么样子?线上发生OOM,你有什么排查思路么?你能说说G1垃圾回收器的工作原理吗?java语言,如何判断两个对象相等呢?了解深拷贝和浅拷贝吗,如何实现深拷贝?http中post请求和get请求有什么区别?get请求用于更新数据能更新吗?如果可以为什么要用post呢?get请求可以携带body吗?http的状态码都有哪些?http和https的区别是什么?redis有哪些常见的数据结构?zset的底层数据结构是什么?跳表和哈希表的区别是什么?跳表执行插入和删除操作,哈希表执行插入和删除操作,底层是怎么做的?------------------------------------------------------------------------------手撕算法(两题都做不出来)leetcode 402. 移掉 K 位数字(原题改了一点存在前导零的情况但是不计数删除次数)leetcode 162. 寻找峰值(不可以使用暴力)-------------------------------------------------------------------------------//总结自己对项目的理解还不够,算法刚开始刷,基础不行,还需要继续努力
查看29道真题和解析
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
4
34
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务