Java 几种常见的OOM

Wesley13
• 阅读 704

Java虚拟机内存有好几个运行时数据区会有OOM的异常,如果能够区分根据报错区分出是哪些区域报出来的异常,会更便于定位问题,解决问题。

1.Java堆溢出

原因:由于不断创建对象实例,当对象数量达到了最大堆的容量限制后产生内存溢出异常。

现象:java.lang.OutOfMemoryError: Java heap space

解决方法:

1)首先确认是内存泄露(Memory Leak)还是内存溢出(Memory Overflow);

2)如果是内存泄漏引起的,查看GC Roots引用链,找出为什么无法被垃圾回收的原因;

3)如果是内存溢出,检查虚拟机的堆参数(-Xmx最大值和-Xms最小值),对比物理内存看是否可以调大;

2.虚拟机栈和本地方法栈溢出

由于Hot Spot虚拟机的实现是不区分两者的,所以可以通过-Xss参数来设定栈容量。

java.lang.StackOverflowError:

原因:在单线程下,虚拟机栈容量太小或者定义了大量的本地变量,会抛出SO;

解决方法:增大虚拟机栈容量;

java.lang.OutOfMemoryError: unable to create new native thread

原因:在多线程下,大量创建新线程,会抛出OOM,每个线程的栈分配的内存越大,越容易产生;

解决方法:减少线程产生、降低最大堆、减少栈容量;

3.运行时常量池溢出

原因:代码在运行时创建了大量的常量,超出了常量池上限;

现象:java.lang.OutOfMemoryError: PermGen space

at java.lang.String.intern(Native Method)

解决方法:通过修改-XX:PermSize和-XX:MaxPermSize参数来修改方法区大小,从而修改常量池大小;

4.方法区溢出

原因:在运行时,ClassLoader动态加载了大量的Class信息,超出方法区上限;

现象:java.lang.OutOfMemoryError: PermGen space

at java.lang.ClassLoader.defineClass(Native Method)

解决方法:通过修改-XX:PermSize和-XX:MaxPermSize参数来修改方法区大小;

总之,引起OOM原因有很多,但是如果能够清楚了解底层内存存储的原理,就能够根据报错信息快速定位OOM报错原因,从而解决问题!

下面罗列一些经常用到的jvm参数:

所有用到的JVM启动参数:

-Xss2M       设置JVM栈内存大小

-Xms20M    设置堆内存初始值

-Xmx20M    设置堆内存最大值

-Xmn10M    设置堆内存中新生代大小

-XX:SurvivorRatio=8  设置堆内存中新生代Eden 和 Survivor 比例

-XX:PermSize=10M  设置方法区内存初始值

-XX:MaxPermSize=10M  设置方法区内存最大值

-XX:MaxDirectMemorySize=10M 设置堆内存中新生代大小

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Easter79 Easter79
2年前
swap空间的增减方法
(1)增大swap空间去激活swap交换区:swapoff v /dev/vg00/lvswap扩展交换lv:lvextend L 10G /dev/vg00/lvswap重新生成swap交换区:mkswap /dev/vg00/lvswap激活新生成的交换区:swapon v /dev/vg00/lvswap
Wesley13 Wesley13
2年前
java虚拟机(四)
 学习了java运行时数据区,知道每个内存区域保存什么数据,可以参考:https://www.cnblogs.com/huigelaile/p/diamondshine.html,然后了解内存溢出和内存泄露是很有必要的,一方面是为了面试,更重要是的在工作中能够快速定位错误原因并且解决内存溢出分类:1、java.lang.OutOf
Stella981 Stella981
2年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Wesley13 Wesley13
2年前
Java内存区域与内存溢出异常
Java的内存管理是一个老生常谈的问题,虽然Java号称可以自动管理自己的内存,使程序员从内存管理的围墙解放出来,但是一连串的内存泄漏和溢出方面的问题,使得我们不得不去深入了解Java的内存管理机制。本篇文章将从Java的内存区域开始剖析Jvm的内存机制,阐述内存溢出异常产生的原因。运行时数据区域众说周知,Java程序是运行在Java虚拟机
Stella981 Stella981
2年前
Memory Analyzer Tool定位Java heap space内存泄漏
javaheapspace是一个很蛋疼的问题,如果开发调试时遇到还好,如果是在项目上线后运行一段时间后,才抛出该异常,那真的很悲剧(那你得找代码中到底是哪里内存泄露了),这真是一个悲伤的故事。  1.javaheadspace堆内存溢出分 析发生这种问题的原因是java虚拟机创建的对象太多,
Stella981 Stella981
2年前
JVM笔记二:Java内存区域
Java程序在虚拟机自动内存管理的机制的帮助下,不容易出现内存泄露和内存溢出问题,这也就要求程序员需要了解虚拟机处理内存的机制,以解决OOM问题。运行时数据区域!Java虚拟机运行时数据区(https://oscimg.oschina.net/oscnet/3755e1d9e9bf4068b2b3b77b4c0b6bf99b8.jpg)
Stella981 Stella981
2年前
JVM探秘3:内存溢出
在Java虚拟机内存区域中,除了程序计数器外,其他几个内存区域都可能会发生OutOfMemoryError,这次通过一些代码来验证虚拟机各个内存区域存储的内容。在实际工作中遇到内存溢出异常时,需要做到能根据异常信息快速判断是哪个内存区域的溢出,知道什么样的代码会导致这些区域内存溢出,并且知道出现内存溢出后如何处理。Java堆溢出Jav
Wesley13 Wesley13
2年前
Java面试笔记整理4
一.Java内存溢出的产生原因和解决办法?java.lang.OutOfMemoryError这个错误我相信大部分开发人员都有遇到过,产生该错误的原因大都出于以下原因:JVM内存过小、程序不严密,产生了过多的垃圾。导致OutOfMemoryError异常的常见原因有以下几种:1.内存中加载的数据量过于庞大,如一次从数据库取出过多数据;2.
十月飞翔 十月飞翔
1年前
9种 OOM 常见原因及解决方案
当JVM内存严重不足时,就会抛出java.lang.OutOfMemoryError错误。本文总结了常见的OOM原因及其解决方法,如下图所示。如有遗漏或错误,欢迎补充指正。1、Javaheapspace当堆内存(HeapSpace)没有足够空间存放新创建的对象时,就会抛出java.lang.OutOfMemoryError:Javahea