java八股文面试[JVM]——什么情况下会抛出OOM

什么情况下,会抛出OOM呢?
  • JVM98%的时间都花费在内存回收

  • 每次回收的内存小于2%

满足这两个条件将触发OutOfMemoryException ,这将会留给系统一个微小的间隙 以做一些Down之前的操作,比如手动打印Heap Dump。并不是内存被耗空的时候才抛出

主要原因有三类:

一,业务需要比较多的内存,但是jvm分配的太少;

二,GC回收内存的速度赶不上程序运行消耗内存的速度。

三,存在内存泄漏情况,比如打开文件不释放、创建网络连接不关闭、不再使用的对象未断开引用关系、使用静态变量持有大对象引用等等,久而久之也会造成OOM。

区域:

发生oom的区域主要在哪里呢?

可以这么说,除了程序计数器以外,其他区域都有可能 。比如直接内存,元空间、本地方法栈、虚拟机栈、堆外等等。

系统OOM之前都有哪些现象?
  • 每次垃圾回收的时间越来越长,由之前的10ms延长到50ms左右,FullGC的时间也有之前的0.5s延长到4、5s

  • FullGC的次数越来越多,最频繁时隔不到1分钟就进行一次FullGC

  • 老年代的内存越来越大并且每次FullGC后,老年代只有少量的内存被释放掉

如何进行堆Dump文件分析?

可以通过指定启动参数 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/usr/app/data/dump/heapdump.hpro 在发生OOM的时候自动导出Dump文件

如何进行GC日志分析?

为了方便分析GC日志信息,可以指定启动参数 【-Xloggc : app-gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps】,方便详细地查看GC日志信息

  1. 使用 【jinfopid】查看当前JVM堆的相关参数

  2. 继续使用 【jstat-gcutil 2315 1s 10】查看10s内当前堆的占用情况

  3. 也可以使用【jmap-heap pid】查看当前JVM堆的情况

  4. 我们可以继续使用 【jmap-F -histo pid | head -n 20】,查看前20行打印,即查看当前top20的大对象,一般从这里可以发现一些异常的大对象,如果没有,那么可以继续排名前50的大对象,分析

  5. 最后使用【jmap -F -dump:file=a.bin pid】,如果dump文件很大,可以压缩一下【tar -czvf a.tar.gz a.bin】

  6. 再之后,就是对dump文件进行分析了,使用MAT分析内存泄露

内存溢出的原因有哪些,如何排查线上问题?
  1. java.lang.OutOfMemoryError: ......java heap space..... 堆栈溢出,代码问题 的可能性极大

  2. java.lang.OutOfMemoryError: GC over head limit exceeded 系统处于高频的GC状态 ,而且回收的效果依然不佳的情况,就会开始报这个错误,这种情况一般是产生了很多不可以被释放的对象,有可能是引用使用不当 导致,或申请大对象 导致,但是java heap space的内存溢出有可能提前不会报这个错误,也就是可能内存就直接不够 导致,而不是高频GC.

  3. java.lang.OutOfMemoryError: PermGen space jdk1.7之前才会出现的问题 ,原因是系统的代码非常多或引用的第三方包 非常多、或代码中使用了大量的常量、或通过intern注入常量、或者通过动态代码加载等方法,导致常量池 的膨胀

  4. java.lang.OutOfMemoryError: Direct buffer memory 直接内存不足 ,因为jvm垃圾回收不会回收掉直接内存这部分的内存 ,所以可能原因是直接或间接使用了ByteBuffer 中的allocateDirect方法的时候,而没有做clear

  5. java.lang.Stack OverflowError - Xss设置的太小了

  6. java.lang.OutOfMemoryError: unable to create new native thread 堆外内存 不足,无法为线程 分配内存区域

  7. java.lang.OutOfMemoryError: request {} byte for {}out of swap 地址空间不够

知识来源:

马士兵教育

什么是oom(Out Of Memory)? - 知乎

相关推荐
测试界的世清6 小时前
各大厂软件测试面试题+答案纯干货
面试·职场和发展
liang_jy8 小时前
内存管理(七)—— 内存映射
面试·操作系统
前端工作日常8 小时前
我学习到的Java中domain和dto区别
java·后端
liang_jy8 小时前
内存管理(六)—— 进程的内存映像
面试·操作系统
码农学院8 小时前
基于Spring Boot的跨境电商多语言订单管理系统架构设计
java·大数据·spring boot
技术小结-李爽9 小时前
【工具】pom文件的<packaging>
java·maven
l1564694810 小时前
突围!图文混合知识库难以解析,Kimi-K3 原生视觉架构深耕知识工作,DMXAPI 统一接口,缩短项目开发周期
java·大数据·开发语言
布吉岛的石头11 小时前
Java 程序员第 45 阶段11:网关统一路由大模型接口,配合 Nacos 配置治理,灰度路由:基于Nacos元数据实现大模型服务灰度发布与权重路由
java·服务发现
我命由我1234511 小时前
Android 开发问题:Cannot resolve method ‘repeat‘ in ‘String‘
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
我叫黑大帅11 小时前
git 的 NFD 与 NFC 有什么区别?为什么我有个文件在 NFC 中间不会被当成改动,在 NFD 中就会当成改动
git·面试·github