内存溢出(Out Of Memory)经常简称为OOM,在jvm中主要分为方法区、堆、栈、本地方法栈、程序计数器这几部分,其中程序计数器是唯一不会出现OOM的,也就是说其他区域都会出现OOM。下面来分别说明几个区域出现OOM的情况及特征。

1. java堆溢出(heap)

Java堆内存主要用来存放运行过程中所有的对象,该区域OOM异常一般会有如下错误信息:

java.lang.OutofMemoryError:Java heap space

可以通过dump的内存快照就能分析,到底是由于程序原因导致的内存泄露,还是由于没有估计好JVM内存的大小而导致的内存溢出。

2. 栈溢出(stack)

栈用来存储线程的局部变量表、操作数栈、动态链接、方法出口等信息。如果请求栈的深度不足时抛出的错误会包含类似下面的信息: java.lang.StackOverflowError。

由于每个线程占的内存大概为1M,因此线程的创建也需要内存空间。如果申请创建的线程比较多超过剩余内存的时候,也会抛出如下类似错误:java.lang.OutofMemoryError: unable to create new native thread

与栈相关的JVM参数有:

1、 -Xss: 每个线程的堆栈大小,JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K.

2、 在相同物理内存下,减小这个值能生成更多的线程.但是操作系统对1个进程内的线程数还是有限制的,不能无限生成。

出现栈溢出可能原因:

递归:递归里用到的局部变量存储在堆栈中,堆栈的访问效率高,速度快,但空间有限,递归太多变量需要一直入栈而不出栈,导致需要的内存空间大于堆栈的空间,栈空间是2M,堆空间内存空间。

运行时常量溢出(constant)

运行时常量保存在方法区,存放的主要是编译器生成的各种字面量和符号引用,但是运行期间也可能将新的常量放入池中,比如String类的intern方法。如果该区域OOM,错误结果会包含类似下面的信息:

1 java.lang.OutofMemoryError: PermGen space

相关的JVM参数有:

1、 -XX:PermSize:设置持久代(perm gen)初始值,默认值为物理内存的1/64

2、 -XX:MaxPermSize:设置持久代最大值,默认为物理内存的1/4

方法区溢出

方法区主要存储被虚拟机加载的类信息,如类名、访问修饰符、常量池、字段描述、方法描述等。理论上在JVM启动后该区域大小应该比较稳定,但是目前很多框架,比如Spring和Hibernate等在运行过程中都会动态生成类,因此也存在OOM的风险。如果该区域OOM,错误结果会包含类似下面的信息:

java.lang.OutofMemoryError: PermGen space

相关的JVM参数有:

1 -XX:PermSize:设置持久代(perm gen)初始值,默认值为物理内存的1/64

2 -XX:MaxPermSize:设置持久代最大值,默认为物理内存的1/4

更多Java面试题,可搜索小程序:IT面试题练习

什么情况下java会出现堆溢出_【Java面试题第三期】JVM中哪些地方会出现内存溢出?出现的原因是什么?...相关推荐

  1. 面试1:Java、微服务、架构常见面试题(持续更新中)

    Java.微服务.架构常见面试题(持续更新中) 文章目录 Java.微服务.架构常见面试题(持续更新中) ==**Java**== 1.Java概述 (1)JVM.JRE和JDK (2)Java特点 ...

  2. java 测试内存溢出_浅析软件测试人员如何对JVM进行内存溢出检测

    一.什么是JVM,检测JVM的意义 JVM是java virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各 ...

  3. 什么情况下你的工作最为成功_如何在没有工作经验的情况下获得技术工作

    什么情况下你的工作最为成功 by Anthony Sistilli 安东尼·西斯蒂里(Anthony Sistilli) 如何在没有工作经验的情况下获得技术工作 (How to get a tech ...

  4. java mbean获取堆信息_实时取得虚拟机类信息、内存信息、MXBean的使用方法

    import java.lang.management.ClassLoadingMXBean; import java.lang.management.ManagementFactory; impor ...

  5. Struts2中我所遇到的内存溢出(java.lang.OutOfMemoryError)异常错误介绍

    1.在我以前写得关于Struts2的文章中,有时候往往会报一些经常出现的错误,今天又出现了,所以特此来介绍一下,并如何解决这种错误. 2.在我们部署项目到Tomcat服务器后,开启Tomcat服务器, ...

  6. ice 服务java连接,java - ICE中的连接计数 - 堆栈内存溢出

    是的,您应该这样做. 每个通信器都创建两个线程池: 客户端线程池为传出连接提供服务,这主要涉及处理传出请求的回复,并包括通知AMI回调对象. 如果在双向模式下使用连接,则客户端线程池还将调度传入的回调 ...

  7. 什么情况下你的工作最为成功_在不倦怠的情况下开始成功学习

    什么情况下你的工作最为成功 How come that one person may learn multiple languages, no matter foreign or programmin ...

  8. jvm性能调优实战 - 43OOM内存溢出发生的原因及可能发生OOM的内存区域

    文章目录 OOM OOM是如何产生的 JVM进程怎么执行你写的那些代码 Java虚拟机栈:让线程执行各种方法 堆内存:放我们创建的各种对象 小结 OOM 先不考虑自己系统外部依赖的缓存.消息队列.数据 ...

  9. android bitmap oom 最新处理办法,【移动开发】Android中图片过大造成内存溢出,OOM(OutOfMemory)异常解决方法...

    当我们在做项目过程中,一遇到显示图片时,就要考虑图片的大小,所占内存的大小,原因就是Android分配给Bitmap的大小只有8M,试想想我们用手机拍照,普通的一张照片不也得1M以上,所以androi ...

最新文章

  1. Java并发编程高级篇(八):在执行器中取消任务
  2. free pascal 修改字符集,会导致 dos 不能显示 汉字。 处理方法如下
  3. Struts2漏洞分析之Ognl表达式特性引发的新思路
  4. matplotlib简介-高质量图形输出
  5. 基于JindoFS+OSS构建高效数据湖
  6. 终于下决心写一写自己的博客了!
  7. php空间搭建tcshare,新秀网 - 宝塔面板搭建天翼云盘目录列表TCShare
  8. 拓端tecdat|R语言生态学模拟对广义线性混合模型GLMM进行功率(功效、效能、效力)分析power analysis环境监测数据
  9. Java 中判断char 是否为空格 和空
  10. 电商直播运营的思路流程
  11. python共有前缀_最长公共前缀-Python
  12. Android任务栈简介
  13. 系统win8 任务栏消失不见的解决办法
  14. 微信小程序毕业论文题目_SSM项目考勤签到管理系统+后台管理系统
  15. latex 图、表 中英文标题
  16. 驾驶员理论考试系统的设计与实现(论文+源码)_kaic
  17. Java-List常用方法
  18. 我的世界服务器自动刷矿机,我的世界刷矿机MOD
  19. DAZ 3D 软件简单安装和使用
  20. html热区坐标,HTML之六:图像的热区连接

热门文章

  1. 记录android离屏渲染的一些资料
  2. tensorflow之安装tensorboard
  3. windows-DOS命令查看DirectX组件版本和软硬件信息版本
  4. centos6.9终端命令
  5. seqkit根据基因id_ID转换靠的是深厚的背景知识加上一点代码技巧
  6. windows docker 设置镜像源_Windows10下搭建第一个Docker应用(Demo)
  7. springboot17 集成SpringSecurity
  8. Tcl Tutorial 笔记6 ·while
  9. matlab积分作图速度慢,MATLAB 多个积分和画图的问题,一直画不出来。
  10. js radio 获值