JVM 整体架构及内存调优(三)| 学习笔记

简介: 快速学习 JVM 整体架构及内存调优。

开发者学堂课程【JVM 整体架构及内存调优 :JVM 整体架构及内存调优(三)】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/1207/detail/18174


JVM 整体架构及内存调优


五、JVM 调优

1.参数

(1)标准参数(-):带一个杠的参数都叫标准参数。

如果是 windows 系统,在 JDK 的 command 里可以看到所有的参数。最常用的有 -verbose 参数,可以根据 java -verbose 引用 class,class 会输出 JVM 的一些相关信息。如果遇到代码类找不到的问题,则可以通过 -verbose:class 打印去观察类是否存在。另外也可以用 -verbose:gc 去打印每次 gc 的情况;同时也还有 -verbose:jni 可以输出 native 方法,调用相关的信息。

以上是 JVM 一些本地方法接口。

(2)非标准参数:(-X)

常见有:-Xloggc,将GC状态记录在文件中(带时间截);

-Xms,设置初始 java 堆大小;

-Xmx,设置最大 java 堆大小;

-Xss ,设置 java 线程堆栈大小;

(3)非 stable 参数( -XX )参数可以被松散的聚合成三类:

①行为参数( Behavioral Options ):用于改变JVM的一些基础行为 ;

image.png

内含垃圾回收器,表格中用黑体标识的参数代表JVM中 GC 执行的三种方式:串行、并行、并发。

②性能调优( Performance Tuning ):用于JVM的性能调优;

image.png

新生代的大小,新生代对象能占用的最大值,新生代对象生成时占用内存的默认值极易新生代和老年代的比例,可以通过性能调优参数进行设置。

③调试参数( Debugging Options):般用于打开跟踪、打印、输出等

JVM 参数,用于显示JVM更加详细的信息;

image.png

出现问题时可以使用,例如指定导出堆信息时的路径或文件名、当首次遭遇 OOM 时导出此时堆中相关信息、遇到 Ctrl-Break 后打印井发锁的相关信息,与jstack -l功能相同。

2.案例

(1)JVM 调优 -jstack 命令

某个系统会有一些大量的消息堆积,需要分析有哪些堆栈信息。

分析过程:

①登陆订阅方所在的服务器,使用 ps -ef lgrep java 或 jps -lm 来查询找到订阅方堆积的应用的 pid。

②使用 jstack -l pid > /tmp/pid.jstack 打印订阅方的线程堆栈信息进行查看

如下图:

image.png

在导出的 jstack 文件中,可以得到一些对账信息,waiting 的数量达到了600+的线程,会存在资源消耗问题,在一直阻塞的过程中会影响到整个程序的后续进行。

总结:

大量线程( 600+ )线程处于 WAITING 状态,阻塞在试图从任务队列中取任务(LinkedBlockingQueue.take),这个任务队列指的是 ThreadPoolExecutor 的线程池启动的线程任务队列;也就是说,这些线程都是空闲状态,因为使用完成之后一直没有关闭,导致一直在等着任务的到来,导致订阅端消费者无法消费消息。

建议:

①使用 ExecutorService 提交的线程任务,也要记得关闭,不关闭会有大量的线程,则会出现消息堆积的问题;

②启动新线程的时候,最好给线程起个名字,这样线程堆栈的问题排查更加容易;

③MQ 消息消费端打印详细日志,消费时间、内容等(消费异常的消息也要打印)。

如果只使用 jstack 信息,没有业务日志,则还需要返回重新查看业务代码来判断问题;如果上述两步完成的较好则解决问题更加迅速。

3.Arthas (阿尔萨斯)能做什么?

作用:得知类从哪个 jar 包加载的、为什么会报各种类相关的 Exception、改的代码为什么没有执行到、程序的执行时间,监控 JVM 实时运行的状态。

官网: https://arthas aliyun.com/doc/

用户案例:https://github.com/alibaba/arthas/issues?q=label%3Auser-case

(1)快速入门:启动 math-game、启动 arthas、查看 dashboard、通过 thread 命令来获取到 math-game 进程的Main Class、通过 jad 来反编译 Main Class。

Dashboard 可以看到 JVM 的一些相关信息

(2)命令

例如 sc,可以看 class 的信息,后面可以添加参数

image.png

watch 命令:可以观察到函数的调用情况,可以观察到函数入参、出参的信息。

(3)案例分析:

image.png 

具有调用链路为三百多毫秒,实际上数据库的执行在几十毫秒左右,剩下的均在程序的运行过程中消耗,这显然是不合理的,所以进行一些优化。通过 Trace 命令优化之后,每个环节具体消耗的时间都清晰可见。Trace 中可以看到消耗最多的是封装的一个SimpleDateFormat. foreatDate() .

原先的代码是 String 类型,每一次编译时都要做 foreatDate,所以将时间点集合Set dateSet 改为Set ,这样会有明显的提升,优化了50毫秒。

相关文章
|
8天前
|
Arthas 监控 Java
JVM进阶调优系列(9)大厂面试官:内存溢出几种?能否现场演示一下?| 面试就那点事
本文介绍了JVM内存溢出(OOM)的四种类型:堆内存、栈内存、元数据区和直接内存溢出。每种类型通过示例代码演示了如何触发OOM,并分析了其原因。文章还提供了如何使用JVM命令工具(如jmap、jhat、GCeasy、Arthas等)分析和定位内存溢出问题的方法。最后,强调了合理设置JVM参数和及时回收内存的重要性。
|
10天前
|
缓存 算法 Java
本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制
在现代软件开发中,性能优化至关重要。本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制。通过调整垃圾回收器参数、优化堆大小与布局、使用对象池和缓存技术,开发者可显著提升应用性能和稳定性。
32 6
|
6天前
|
监控 Java 编译器
Java虚拟机调优实战指南####
本文深入探讨了Java虚拟机(JVM)的调优策略,旨在帮助开发者和系统管理员通过具体、实用的技巧提升Java应用的性能与稳定性。不同于传统摘要的概括性描述,本文摘要将直接列出五大核心调优要点,为读者提供快速预览: 1. **初始堆内存设置**:合理配置-Xms和-Xmx参数,避免频繁的内存分配与回收。 2. **垃圾收集器选择**:根据应用特性选择合适的GC策略,如G1 GC、ZGC等。 3. **线程优化**:调整线程栈大小及并发线程数,平衡资源利用率与响应速度。 4. **JIT编译器优化**:利用-XX:CompileThreshold等参数优化即时编译性能。 5. **监控与诊断工
|
17天前
|
存储 监控 Java
JVM进阶调优系列(8)如何手把手,逐行教她看懂GC日志?| IT男的专属浪漫
本文介绍了如何通过JVM参数打印GC日志,并通过示例代码展示了频繁YGC和FGC的场景。文章首先讲解了常见的GC日志参数,如`-XX:+PrintGCDetails`、`-XX:+PrintGCDateStamps`等,然后通过具体的JVM参数和代码示例,模拟了不同内存分配情况下的GC行为。最后,详细解析了GC日志的内容,帮助读者理解GC的执行过程和GC处理机制。
|
24天前
|
存储 算法 Java
Java虚拟机(JVM)的内存管理与性能优化
本文深入探讨了Java虚拟机(JVM)的内存管理机制,包括堆、栈、方法区等关键区域的功能与作用。通过分析垃圾回收算法和调优策略,旨在帮助开发者理解如何有效提升Java应用的性能。文章采用通俗易懂的语言,结合具体实例,使读者能够轻松掌握复杂的内存管理概念,并应用于实际开发中。
|
25天前
|
Arthas 监控 数据可视化
JVM进阶调优系列(7)JVM调优监控必备命令、工具集合|实用干货
本文介绍了JVM调优监控命令及其应用,包括JDK自带工具如jps、jinfo、jstat、jstack、jmap、jhat等,以及第三方工具如Arthas、GCeasy、MAT、GCViewer等。通过这些工具,可以有效监控和优化JVM性能,解决内存泄漏、线程死锁等问题,提高系统稳定性。文章还提供了详细的命令示例和应用场景,帮助读者更好地理解和使用这些工具。
|
30天前
|
监控 架构师 Java
JVM进阶调优系列(6)一文详解JVM参数与大厂实战调优模板推荐
本文详述了JVM参数的分类及使用方法,包括标准参数、非标准参数和不稳定参数的定义及其应用场景。特别介绍了JVM调优中的关键参数,如堆内存、垃圾回收器和GC日志等配置,并提供了大厂生产环境中常用的调优模板,帮助开发者优化Java应用程序的性能。
|
1月前
|
存储 监控 算法
JVM调优深度剖析:内存模型、垃圾收集、工具与实战
【10月更文挑战第9天】在Java开发领域,Java虚拟机(JVM)的性能调优是构建高性能、高并发系统不可或缺的一部分。作为一名资深架构师,深入理解JVM的内存模型、垃圾收集机制、调优工具及其实现原理,对于提升系统的整体性能和稳定性至关重要。本文将深入探讨这些内容,并提供针对单机几十万并发系统的JVM调优策略和Java代码示例。
50 2
|
1月前
|
Java
JVM进阶调优系列(5)CMS回收器通俗演义一文讲透FullGC
本文介绍了JVM中CMS垃圾回收器对Full GC的优化,包括Stop the world的影响、Full GC触发条件、GC过程的四个阶段(初始标记、并发标记、重新标记、并发清理)及并发清理期间的Concurrent mode failure处理,并简述了GC roots的概念及其在GC中的作用。
|
1月前
|
存储 Kubernetes 架构师
阿里面试:JVM 锁内存 是怎么变化的? JVM 锁的膨胀过程 ?
尼恩,一位经验丰富的40岁老架构师,通过其读者交流群分享了一系列关于JVM锁的深度解析,包括偏向锁、轻量级锁、自旋锁和重量级锁的概念、内存结构变化及锁膨胀流程。这些内容不仅帮助群内的小伙伴们顺利通过了多家一线互联网企业的面试,还整理成了《尼恩Java面试宝典》等技术资料,助力更多开发者提升技术水平,实现职业逆袭。尼恩强调,掌握这些核心知识点不仅能提高面试成功率,还能在实际工作中更好地应对高并发场景下的性能优化问题。