JVM 性能调优

JVM 性能调优

准备日志

我们需要对 JVM 进行配置,以便在 JVM 内存溢出的时候自动把堆内存信息进行快照:
JVM 参数增加 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/XXX/testdump 
如果是 Tomcat,需要在 tomcat 的 bin 目录下找到 catalina.sh 在其中加入配置
加入位置在

# OS specific support.  $var _must_ be set to either true or false.
cygwin=false

这两句之上,加入如下语句

JAVA_OPTS="-server -Xms100m -Xmx100m .......... **-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/XXX/testdump** "

/home/XXX/testdump 路径下会自动创建文件名为 <pid>.hprof 的文件
或者直接通过
jmap -dump:live,format=b,file=/opt/jvm/dump.hprof <pid>
打印堆内存快照,具体可查看《JVM 性能查看命令》 1.6 小节

问题排查

使用分析工具 VisualVM,如果提示内存不足,则到配置文件地址中修改内存:
%JDK_HOME%\lib\visualvm\etc\visualvm.conf
可以打开之后,开始排查
例子:
如何排查 java.lang.OutOfMemoryError: GC overhead limit exceeded
https://blog.csdn.net/xiakexiaohu/article/details/116242366
实践
https://blog.csdn.net/prestigeding/article/details/89075661
以后写代码开始考虑内存占用问题。
其实看多了 JVM 堆内存,之后我们就会发现其实占用最大的类型几乎都是字符串和数组,我们只能去看这些字符串和数组的值的业务特征,去定位可能出问题的业功能模块,这是为我们的排查确定一个大概的方向,方向定了就得去看代码了,然后在看代码的时候,要对这个代码对内存做了什么操作心知肚明,最终就能定位到具体的类,或者某一行代码,
如果这个方向错了,后面的所有尝试都会错。所以排查内存异常更多的是看对业务的熟悉程度。