• 作者:老汪软件技巧
  • 发表时间:2024-10-15 11:05
  • 浏览量:

介绍

在前面两篇文章中介绍了垃圾回收器的基础知识,本篇文章主要jvm优化以及相关工具。

垃圾回收器会分为3篇文章介绍:

对于VisualVM工具其实很简单点一点就会了,因为觉得没什么好写的,所以这篇文章一直也就没有写;会使用工具可以让我们更快速的解决问题,例如给我们一个dump日志,通过VisualVM分析可以快速了解到是内存的使用情况。但无法监控整个运行的过程,除非线上远程debug,但这是一个很危险的操作,并且有很多apm可以给到我们想要的数据。

优化jvm

可以思考一下优化jvm能给我们带来什么价值?相信对于绝大多数应用是没有任何价值的。对于值得优化的应用,例:

1、对sla有严格要求的系统;

垃圾回收推文__回收垃圾的文字

2、部署了成百上千个占用了大量资源的pod等。

并且对绝大部分应用需要优化jvm,绝大部分都是通过分析应用cpu、内存最终定位到某一段代码,对代码进行优化,例如内存oom、计算时间复杂度过高导致cpu过高等。而调整jvm参数对应用并不会起到很明显的提升,大多数都不如升级jdk版本提升的明显。例如:G1在jdk11版本性能明显要好于jdk8。

工具使用

平时工作使用最多的就是arthas,能很方便的定位到一些线上问题,例如cpu过程,可以通过dashboard命令来可以快速知道哪个线程占用的cpu多、每个内存区域占用内存情况可以适当的调整给pod分配的cpu以及各个区域的内存。

VisualVM工具更多的是分析线上的一些内存日志,但用的并不多绝大部分都是一些应用oom来快速定位哪个类产生的问题。

还有一些线上apm,例如:skywalking、pinpoint,pinpoint对于整体链路出入参记录的更加详细,完全可以只根据ponpoint就可以定位线上问题,但整体搭建维护较为复杂;skywalking链路内容就稍微差一些但好在拓展比较强,可以自己实现一些插件进行拓展。

注意事项

目前是使用的k8s,对于堆内存配置不能再使用之前传统的-Xmx等命令了,因为pod分配的内存是可变化的,尽量采用-XX:MaxRAMPercentage百分比参数来进行分配内存,同时-XX:+HeapDumpOnOutOfMemoryError参数配置时需要注意内存分配比例,因为在应用程序dump日志时需要消耗的内存和目前应用程序所使用的内存是差不多的,如果应用分配的堆内存比例超过百分之50,那大概率会导致pod oom,pod oom会直接kill -9直接杀掉pod,导致我们的dump日志无法生成。