介绍
在前面两篇文章中介绍了垃圾回收器的基础知识,本篇文章主要jvm优化以及相关工具。
垃圾回收器会分为3篇文章介绍:
- 第一篇:垃圾判断方法;垃圾清除算法;jvm中传统垃圾回收器;各个垃圾回收器的组合;文章跳转
- 第二篇:oopMap、安全点、安全区、记忆集、三色标记法以及存在的问题;ZGc、Shenandoah介绍;
- 第三篇:VisualVM工具使用,内存分析。
对于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日志无法生成。