常用调优命令及各种 OOM 的应对策略【JVM调优】

1. 常见的调优命令

① jps:显示所有虚拟机进程;
② jstack:生成当前线程快照;
③ jmap:生成 dump 堆转储文件;
④ jhat:与 jmap 搭配使用,生成 dump 的分析结果;
⑤ jstat:监控虚拟机运行时的状态信息;
⑥ jinfo:实时查看和调整虚拟机运行参数。

2. 常见的性能调优

① -Xmx:设置堆内存的最大限制;
② -XX:NewSize:设置新生代的大小;
③ -XX:NewRatio:设置新生代和老年代的占比;
④ 设定垃圾回收器,新生代用 -XX:+UseParNewGC,年老代用 -XX:+UseConcMarkSweepGC。

在这里插入图片描述

3. 常用的调优工具

① jconsole:是JDK中自带的java监控和管理控制台,用于对JVM中内存、线程和类等的监控;
② jvisualvm,jdk自带全能工具,可以分析内存快照、线程快照、监控内存变化、GC变化等;
③ MAT,它是一个基于Eclipse的内存分析工具,是快速、功能丰富的Java heap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗;
④ GChisto,一款专业分析gc日志的工具。

4. 各种 OOM 的应对策略

(1)堆内存溢出

什么情况呢?就是我们不断地创建对象,并且 GC Roots 到对象之间有可达路径,所以垃圾回收器并不会回收这些对象,当堆中对象的数量超过最大堆容量限制后,发生内存溢出。

出现这种异常,我们需要把堆快照文件 dump 下来进行单独分析。然后判断内存中的对象是否有存在的必要,也就是说这是内存泄漏还是内存溢出?

如果是内存泄漏,可通过工具查看它的引用链,分析是什么原因导致无用对象长期被引用着,然后修改业务代码;如果是内存溢出,考虑重新设置虚拟机参数(-Xms、-Xmx)。

(2)栈溢出

当应用程序递归太深时容易发生栈溢出。

栈溢出的原因:递归太深、大量循环、死循环或全局变量过多等。

(3)运行时常量池溢出

由于常量池分配在方法区内,我们可以通过 -XX:PermSize 和 -XX:MaxPermSize 限制方法区的大小,从而间接限制其中常量池的容量。

(4)方法区溢出

检查一下某些类是不是没有做缓存,导致频繁地加载生成,修改业务代码改进。如果类加载正常,那我们可以通过 -XX:PermSize 和 -XX:MaxPermSize 来限制方法区的大小。

5. 配置垃圾收集器

① 首先是内存大小的问题,给每一个内存区域都设置一个上限,比如堆空间会设置成操作系统的 2/3;
② 接下来进行初步优化,根据情况,合理设置新生代和老年代的比例;
③ 专项优化,优化依据是系统容量、吞吐量、访问延迟等,由于是高并发环境下,所以 STW 的时间应该被高度重视;
④ 借用日志分析工具,快速定位到具体的问题。

6. CPU 占用过高

首先使用 top -Hp 命令,可查看是哪个线程占用的 CPU 最高,然后使用 jstack 命令找到具体的线程。
如果是业务线程,就去找是哪个方法导致 CPU 高占用的;如果是 GC 线程,那么一定是频繁的 GC 造成 CPU 高涨,这时候就要去读日志找原因了,可以使用日志分析工具 GChisto。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 1. Spark中JVM内存使用及配置详情: Spark中的JVM内存使用主要包括堆内存和非堆内存。堆内存用于存储对象实例,而非堆内存用于存储类信息、方法信息等。在Spark中,可以通过以下参数来配置JVM内存使用: - spark.driver.memory:用于配置Driver进程的堆内存大小,默认为1g。 - spark.executor.memory:用于配置Executor进程的堆内存大小,默认为1g。 - spark.driver.extraJavaOptions:用于配置Driver进程的非堆内存大小和其他JVM参数。 - spark.executor.extraJavaOptions:用于配置Executor进程的非堆内存大小和其他JVM参数。 2. Spark报错与: 在Spark运行过程中,可能会出现各种报错,如内存溢出、任务失败等。针对这些报错,可以采取以下措施: - 内存溢出:增加Executor进程的堆内存大小、减少每个任务的数据量、使用缓存等方式来减少内存使用。 - 任务失败:增加Executor进程的数量、减少每个任务的数据量、整任务的并行度等方式来提高任务的执行效率。 3. Spark内存溢出OOM异常: Spark内存溢出OOM异常是指Executor进程的堆内存不足以存储当前任务所需的数据,导致任务执行失败。可以通过增加Executor进程的堆内存大小、减少每个任务的数据量、使用缓存等方式来减少内存使用,从而避免内存溢出异常的发生。 ### 回答2: Spark中JVM内存使用及配置详情: Spark使用JVM来执行任务,其中一个非常重要的参数是堆内存(Heap Memory)的大小。堆内存用于存储对象实例和方法用的信息。在使用Spark时,可以通过spark.driver.memory和spark.executor.memory参数来配置JVM堆内存的大小,默认情况下,它们都是1g。需要根据具体的任务需求和集群资源情况来进行整。如果遇到内存不足的情况,可以增加堆内存的大小,但是需要保证集群资源充足。 Spark报错与: 在使用Spark过程中,常见的报错有内存溢出、数据倾斜、任务运行时间过长等问题。对于这些问题,可以采取一些策略进行处理。例如,在遇到内存溢出(Out of Memory)异常时,可以通过增加堆内存大小或者减少数据量来解决;对于数据倾斜的情况,可以考虑数据重分区或者使用一些聚合策略化;对于任务运行时间过长的情况,可以考虑增加Spark任务的并行度或者使用缓存机制来加速计算等。 Spark内存溢出(OOM)异常: Spark中的内存溢出异常通常是由于使用的内存超过了配置的阈值引起的。在配置Spark应用程序时,可以设置spark.driver.memory和spark.executor.memory参数来JVM堆内存的大小。如果内存不足,则需要增加内存配置或者化代码逻辑。另外,可以通过设置spark.memory.offHeap.enabled参数来开启堆外内存,将一部分内存放到堆外,从而减少对JVM堆内存的占用。此外,还可以通过设置spark.memory.fraction参数来JVM堆内存的分配比例,更好地利用内存资源。如果整参数后仍然出现内存溢出问题,还可以考虑整Spark任务的并行度或者增加集群资源。 ### 回答3: Spark是一个基于内存的数据处理框架,能够高效地处理大规模数据集。在Spark中,JVM内存的使用及配置对于保证程序的稳定和性能的提升非常重要。 首先,Spark的JVM内存分为堆内存和非堆内存两部分。堆内存是用来存储对象实例的,而非堆内存则用来存储JVM本身的运行时数据。为了合理配置JVM内存,可以通过配置spark.driver.memory和spark.executor.memory参数来设置堆内存的大小。根据集群的硬件配置和任务的需求情况,可以根据具体情况来整这两个参数的数值。 其次,在Spark运行过程中,经常会遇到各种报错。常见的报错有内存溢出(OutOfMemoryError)、任务失败(TaskFail)等。当遇到内存溢出错误时,可以尝试以下几种方法来: 1. 增加可用内存:可以通过增加executor内存或整任务分区大小来扩大可用内存。 2. 减少数据规模:可以通过过滤数据、采样数据或者使用压缩算法来减少数据的大小。 3. 化代码:可以化代码逻辑和算法,减少内存使用。 4. 整缓存策略:可以通过手动控制缓存的数据量,及时释放不再使用的缓存。 最后,Spark的内存溢出(OOM)异常通常是由于数据量过大,超出了可用内存的限制而导致的。当出现内存溢出异常时,可以参考上述的方法来解决问题。 总之,合理配置JVM内存、及时处理报错、避免内存溢出异常是保证Spark程序稳定与性能的关键。希望以上回答对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

栈老师不回家

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值