金三银四跳槽季,这份宝典让你一路开挂
哈喽,小伙伴们好,金三银四跳槽季将至,估计小伙伴们都在备战,来问问题的也多了起来,尤其是问OOM与JVM调优相关的问题。只能感叹,大家都太不容易了。明明只是小白、明明只想找份工作、明明没有机会接触到OOM与调优……却被现实逼着要去搞懂JVM、OOM、调优……本篇文章是结合大厂与小厂的同学们问的问题,结合我的工作经历整理总结而来。看懂、理解、背下来,当面试官再问你OOM与调优,一定被你征服。
看完这篇文章,大家能获得的知识:
1、什么是OOM
2、为什么会发生OOM
3、哪些区域会发生OOM
4、JVM进程挂了,会有哪些可能性
5、生产环境的JVM无响应了,如何快速定位问题
6、给你的一些成熟的调优建议
01
什么是OOM
OOM是Out Of Memory的缩写。即内存溢出。
02
为什么会发生OOM
如果面试官问这个问题,我知道每个人都能说一大堆,但是我希望大家就回答下面三句话,言简意赅:
业务正常运行起来就需要比较多的内存,而给JVM设置的内存过小。具体表现就是程序跑不起来,或者跑一会就挂了。
GC回收内存的速度赶不上程序运行消耗内存的速度。出现这种情况一般就是往list、map中填充大量数据,内存紧张时JVM拆东墙补西墙补不过来了。所以查询记得分页啊!不需要的字段,尤其是数据量大的字段,就不要返回了!比如文章的内容。
存在内存泄漏情况,久而久之也会造成OOM。哪些情况会造成内存泄漏呢?比如打开文件不释放、创建网络连接不关闭、不再使用的对象未断开引用关系、使用静态变量持有大对象引用……
03
哪些区域会发生OOM
JVM运行时数据区五个区域中,除了程序计数器不会发生OOM,其他区域都有可能。
除了元空间、本地方法栈、虚拟机栈、堆外,还有一块区域大家容易忽略,即直接内存。
不知道什么是直接内存?看这张图
模拟这五个区域的OOM,可能有些小伙伴不知道程序怎么写,我已经给大家写好测好了,私信回复“需要”,即可领取哦!
可能有些小伙伴又要说了:搞挂JVM,我有无数的办法,可怎么让它一直活着或活得更久更好呢?不要着急哦!下篇文章带你揭秘她!
04
JVM挂了有哪些可能性
从Windows系统角度说,JVM进程如果不是你手动关闭的,那就是OOM导致的。但是在Linux下就不一定了,因为Linux系统有一种保护机制:OOM Killer。这个机制如果展开来说又能说一堆,这里我就大概说下吧,这个机制是Unix内核独有的,它的出现是为了保证系统在可用内存较少的情况下依旧能够运行,会选择杀掉一些分值较高的进程来回收内存。这个分值是Unix内核根据一些参数动态计算出来的,当然,我们也可以改变,感兴趣的小伙伴百度学习吧。作为Java程序员,了解到这个程度基本够用了,再底层的话,很多面试官也不知道,也不会问。
除了OOM Killer,剩下的就是OOM导致JVM进程挂了。
05
生产环境如何快速定位问题
如果面试官问你这个问题;如果你们公司的生产环境出现过这样的问题;如果你想解决却束手无策……照着这个流程去说去做即可。
前面说了,算上直接内存,共有五个区域会发生OOM:直接内存、元空间、本地方法栈、虚拟机栈、元空间。
本地方法栈与虚拟机栈的OOM咱们可以不用管,为什么呢?因为这两个区域的OOM你在开发阶段或在测试阶段就能发现。GET到了吗?小伙伴们。所以这两个区域的OOM是不会生成dump文件的。
好,开始正题。如果生产环境JVM挂了,这时候不要慌,有节奏的来分析来排除。首先排除是不是被Linux杀死了,怎么看呢?通过命令[sudo egrep -i -r 'Out Of' /var/log]查看,如果是,关闭一些服务,或者把一些服务移走,腾出点内存。
如果不是,这时候就可以确定是OOM导致的,那具体是哪个OOM导致的呢?看有没有生成dump文件。如果生成了,要么是堆OOM,要么是元空间OOM;如果没生成,直接可以确定是直接内存导致的OOM。怎么解决呢?调优呗。
我这边是生成了的,所以需要进一步排查,是堆OOM还是元空间OOM。这时候需要把dump文件从服务器上下载下来,用visualvm分析。当前其他工具如MAT、JProfiler都可以,我习惯用visualvm。很多小伙伴不会看dump日志哈,教给你诀窍,学会了,受益无穷。
如果你发现发生OOM的位置是创建对象,调用构造方法之类的代码,那一定是堆OOM。<init>就是构造方法的字节码格式。所以学点JVM底层知识还是有必要的啊。
如果你发现发生OOM的位置是类加载器那些方法,那一定是元空间OOM。
怎么样,学会了吗?
如果发生OOM让JVM自动dump内存的设置你没开,那你可以跑路了,老板正在赶来的路上,手上拿着大刀!
为了让大家更好的理解,我画成了流程图。私信回复“需要”,即可领取哦!
06
一些成熟的建议
接下来才是重点,我来给你一些实战经验,让你在面试中或工作中更加自信:
调优参数务必加上-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=,发生OOM让JVM自动dump出内存,方便后续分析问题解决问题
堆内存不要设置的特别大,因为你设置的特别大,发生OOM时生成的dump文件就特别大,不好分析。建议不超过8G。
想主动dump出JVM的内存,有挺多方式,但不管哪种方式,主动dump内存会引发STW,请择时操作。即通过arthas提供的命令heapdump主动dump出JVM的内存,这个操作会引发FGC,背后是STW,操作时请选择好时机,不然老板可能提刀来见。
我提供的代码务必拉下来跑跑,找下感觉。最好是自己也去写一份与我提供的不同的,加深理解,加深印象。
总结
感谢阅读,希望对你有所帮助!
需要上述资料的小伙伴们,私信回复“需要”,即可免费领取哦!
金三银四跳槽季,这份宝典让你一路开挂相关推荐
- 【金三银四跳槽季】Java工程师如何在1个月内做好面试准备?
点击上方"蓝字", 右上角选择"设为星标" 周一至周五早11点半!精品文章准时送上! 本文来自石杉的架构笔记 目录 一.写在前面 二.技术广度的快速准备 三.技 ...
- 金三银四跳槽季求职指南
又到了一年一度的金三银四跳槽季了.大家伙儿肯定都有一定的想法. "出去试试水,看看自己市场价值" "这家早干烦了,赶紧换,不想当工具人了" "老板有毛 ...
- 【金三银四跳槽季】Java工程师的面试之路,需要“解锁”哪些技术盲点?
春节长假转眼已过,即将迎来的是一年一度的金三银四跳槽季. 相信大家在应聘一些中大型互联网公司的Java工程师岗位时遇到了不少困惑. 举个例子:有朋友说他在面试前其实也做了精心准备,网上搜集了不少Jav ...
- routing zuul_金三银四跳槽季快到了:送上Spring cloud全家桶系列之Zuul
一.前言 金三银四跳槽季快到了:送上Spring cloud全家桶系列之Eureka 金三银四跳槽季快到了:送上Spring cloud全家桶系列之Feign 金三银四跳槽季快到了:送上Spring ...
- 过五关斩六将,一举拿下首张“金三银四”跳槽季的面试offer!熬夜成熊猫眼“筛选”出的面试真题
人往高处走水往低处流,十二月已来,"金三银四"招聘季还会远吗? 转眼2021年招聘季就要来了,没点真本事真技术,没点面试经验,不了解点职场套路,如何过五关斩六将?如何打败面试官?如 ...
- 软件测试人员如何在“金三银四”跳槽季找到理想工作?
每年的"金三银四"都是职场人跳槽的绝佳时机,很多人都蠢蠢欲动,希望能拿更高的薪资,能去更好的平台- 但同时很多人也在犹豫和观望,因为不确定自己跳槽后能否变得更好,这也成了某平台圆桌 ...
- “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
如果第二次看到我的文章,欢迎下方扫码订阅我的个人公众号(跨界架构师)哟~ 本文长度为5723字,建议阅读15分钟. 坚持原创,每一篇都是用心之作- 这是一篇以程序员视角写的文章,但是内容是互联网行业通 ...
- “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面 1
如果第二次看到我的文章,欢迎文末扫码订阅我的公众号(跨界架构师)哟~ > 本文长度为5723字,建议阅读15分钟. 坚持原创,每一篇都是用心之作- 这是一篇以程序员视角写的文章,但是内容是互联 ...
- 金三银四跳槽季,java面试突击(100题)进大厂就这么简单
1.谈谈对面向对象思想的理解 首先,谈谈"面向过程"vs"面向对象" 我觉得这两者是思考角度的差异,面向过程更多是以"执行者"的角度来思考问 ...
最新文章
- 机器学习(7)--VC维数
- 洛谷T172098 子串-substr
- neo4j 显示名字_Neo4j:绘制“我的名字是……我在工作”图
- Python 命令行库的大乱
- java mongodb怎删改查_Java连接MongoDB进行增删改查
- 从Oracle到PostgreSQL:最全控制文件
- 刚进职场的新人,这6点一定要牢记
- 基于proteus的一个微程序CPU
- 手机版python3.8.1下载_python3.8.1汉化版
- 15款替代微软产品的开源软件
- SaaS启动阶段增长指南(上)
- 打字速度测试php源码,打字练习-打字速度测试-在线工具
- 满纸荒唐言:Processing 寻觅文字魅力篇
- 叶俊在深圳天长地久集团培训会上谈到“唤醒沟通力与工匠精神”
- 简单的理解unicode和utf-8的关系
- numpy函数:arange(),reshape()用法,
- 项目时间管理-知识领域
- python count函数代码_python中count函数简单用法
- 复制公司代码后更改会计科目表(OB62),报错:更改会计科目表前重置公司码数据-OBR1/OBR2
- 今天推荐一下网友张迪的博客