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毫秒。

相关文章
|
2月前
|
缓存 Prometheus 监控
Elasticsearch集群JVM调优设置合适的堆内存大小
Elasticsearch集群JVM调优设置合适的堆内存大小
358 1
|
5天前
|
自然语言处理 JavaScript Java
《鸿蒙HarmonyOS应用开发从入门到精通(第2版)》学习笔记——HarmonyOS架构介绍
HarmonyOS采用分层架构设计,从下至上分为内核层、系统服务层、框架层和应用层。内核层支持多内核设计与硬件驱动;系统服务层提供核心能力和服务;框架层支持多语言开发;应用层包括系统及第三方应用,支持跨设备调度,确保一致的用户体验。
119 81
|
10天前
|
存储 Java 程序员
【JVM】——JVM运行机制、类加载机制、内存划分
JVM运行机制,堆栈,程序计数器,元数据区,JVM加载机制,双亲委派模型
|
30天前
|
监控 架构师 Java
Java虚拟机调优的艺术:从入门到精通####
本文作为一篇深入浅出的技术指南,旨在为Java开发者揭示JVM调优的神秘面纱,通过剖析其背后的原理、分享实战经验与最佳实践,引领读者踏上从调优新手到高手的进阶之路。不同于传统的摘要概述,本文将以一场虚拟的对话形式,模拟一位经验丰富的架构师向初学者传授JVM调优的心法,激发学习兴趣,同时概括性地介绍文章将探讨的核心议题——性能监控、垃圾回收优化、内存管理及常见问题解决策略。 ####
|
30天前
|
存储 监控 算法
深入探索Java虚拟机(JVM)的内存管理机制
本文旨在为读者提供对Java虚拟机(JVM)内存管理机制的深入理解。通过详细解析JVM的内存结构、垃圾回收算法以及性能优化策略,本文不仅揭示了Java程序高效运行背后的原理,还为开发者提供了优化应用程序性能的实用技巧。不同于常规摘要仅概述文章大意,本文摘要将简要介绍JVM内存管理的关键点,为读者提供一个清晰的学习路线图。
|
1月前
|
存储 缓存 监控
Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
本文介绍了Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
108 7
|
2月前
|
Java
JVM内存参数
-Xmx[]:堆空间最大内存 -Xms[]:堆空间最小内存,一般设置成跟堆空间最大内存一样的 -Xmn[]:新生代的最大内存 -xx[use 垃圾回收器名称]:指定垃圾回收器 -xss:设置单个线程栈大小 一般设堆空间为最大可用物理地址的百分之80
|
2月前
|
监控 Java 编译器
Java虚拟机调优指南####
本文深入探讨了Java虚拟机(JVM)调优的精髓,从内存管理、垃圾回收到性能监控等多个维度出发,为开发者提供了一系列实用的调优策略。通过优化配置与参数调整,旨在帮助读者提升Java应用的运行效率和稳定性,确保其在高并发、大数据量场景下依然能够保持高效运作。 ####
36 1
|
2月前
|
Java
JVM运行时数据区(内存结构)
1)虚拟机栈:每次调用方法都会在虚拟机栈中产生一个栈帧,每个栈帧中都有方法的参数、局部变量、方法出口等信息,方法执行完毕后释放栈帧 (2)本地方法栈:为native修饰的本地方法提供的空间,在HotSpot中与虚拟机合二为一 (3)程序计数器:保存指令执行的地址,方便线程切回后能继续执行代码
25 3
|
2月前
|
存储 算法 Java
JVM进阶调优系列(10)敢向stop the world喊卡的G1垃圾回收器 | 有必要讲透
本文详细介绍了G1垃圾回收器的背景、核心原理及其回收过程。G1,即Garbage First,旨在通过将堆内存划分为多个Region来实现低延时的垃圾回收,每个Region可以根据其垃圾回收的价值被优先回收。文章还探讨了G1的Young GC、Mixed GC以及Full GC的具体流程,并列出了G1回收器的核心参数配置,帮助读者更好地理解和优化G1的使用。

热门文章

最新文章