1.堆溢出

原因:大量对象占据了堆空间,而这些对象都有强引用导致无法回收,当对象大小之和>Xmx参数指定的堆大小时导致溢出!

List<byte[]> list = new ArrayList<>();for (int i = 0; i < 10240; i++) {list.add(new byte[1024 * 1024]);}

解决方法是使用-Xmx增大堆大小,但是堆空间毕竟不能无限增长,所以需要使用MAT和VM等工具找到大量占用堆空间的对象做出合理的程序优化。


直接内存溢出
NIO直接向操作系统申请,但是由于没有内JVM托管,如果使用不当也会导致内存溢出。

过多线程导致OOM
因为每个线程需要占用系统内存,当线程过多可能导致OOM,线程的栈空间是在堆外分配,和直接内存很相似,如果要系统支持更多的线程,那么应该使用小的堆空间。
解决办法:
1).减少堆空间 -Xmx512m 这样操作系统可以预留更多内存用于线程创建 因此程序可以正常运行
2).减少线程所占的内存空间,使用-Xss可以指定栈空间  -Xmx1g -Xss128k
使用1G堆空间,但是栈空间减少到128K,剩余可以用的内存可以容纳更多的线程,但是减少栈空间,栈溢出的风险增加。
3).减少线程总数


2.栈溢出

java虚拟机规范定义了两种异常与栈空间有关:StackOverflowError和OutOfMemoryError

线程计算过程中 栈深度>最大可用栈深度 抛出StackOverflowError
如果栈可以动态扩展,如果扩展过程中没有足够内存空间支持会抛出OutOfMemoryError

-Xss设置栈大小,栈大小决定了函数调用的可达深度

虚拟机栈在运行时使用了栈帧的数据结构保持上下文数据,栈帧中存放了局部变量表,操作数栈,动态连接方法和返回地址等信息。
每一个方法的调用都伴随着栈帧的入栈操作,函数返回表示出栈。如果参数和局部变量过多那么栈帧的局部变量表会变大。

无限递归导致

public class TestDemo {private int count = 0;public void recursion() {count++;recursion();}@Testpublic void testStack() {try {recursion();} catch (Throwable e) {System.out.println("深度>>>" + count);e.printStackTrace();}}
}

jclasslib可以查看class文件每个方法分配的局部变量表内容,

下载地址:https://github.com/ingokegel/jclasslib/releases

在栈帧中与性能调优关系最密切的就是局部变量表:函数的参数+函数内局部变量,局部变量表以字为单位,一个字32位长,long和double占2字,其余1字。
对于非static方法虚拟机还将对象this作为参数通过局部变量表传递给当前方法。

3.永久区溢出
如果系统定义了太多的类型,那么永久区会溢出,Jdk1.8中永久区被称为元数据的区域代替,但是功能是类似的,都是保持类的元信息。
例如使用Cglib动态产生新类(而不是new对象)N次会都爱吃OOM异常。
解决办法:
1.增加MaxPermSize
2.减少系统需要的类的数量
3.使用ClassLoader合理的装载类定期回收

参考《Java程序性能优化 让你的Java程序更快、更稳定》

JVM内存溢出的几种情形相关推荐

  1. JVM内存溢出的几种方式与解决方法

    内存溢出 JVM运行时首先需要类加载器(classLoader)加载所需类的字节码文件.加载完毕交由执行引擎执行,在执行过程中需要一段空间来存储数据(类比CPU与主存).这段内存空间的分配和释放过程正 ...

  2. 生产环境 JVM 内存溢出案例分析

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 来源:blog.csdn.net/prestigeding ...

  3. 生产环境JVM内存溢出案例分析

    如果我们所在公司的业务量比较大,在生产环境经常会出现JVM内存溢出的现象,那我们该如何快速响应,快速定位,快速恢复问题呢? 本文将通过一个线上环境JVM内存溢出的案例向大家介绍一下处理思路与分析方法. ...

  4. 生产环境JVM内存溢出案例分析!

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:Nginx 为什么快到根本停不下来? 个人原创100W+访问量博客:点击前往,查看更多 来源:blog.csdn ...

  5. Tomcat中JVM内存溢出及合理配置(转:http://blog.csdn.net/ye1992/article/details/9344807)

    Tomcat本身不能直接在计算机上运行,需要依赖于硬件基础之上的操作系统和一个Java虚拟机.Tomcat的内存溢出本质就是JVM内存溢出,所以在本文开始时,应该先对Java JVM有关内存方面的知识 ...

  6. linux查看tomcat启动内存溢出,关于tomcat乱码以及tomcat jvm 内存溢出问题的解决方案和理论-Fun言...

    一:乱码问题1(前端通过url方式传递中文参数后台收到的是????) 此为Tomcat根目录-conif-server.xml 中 connectionTimeout="20000″ red ...

  7. tomcat中 JVM 内存溢出及合理配置

    Tomcat本身不能直接在计算机上运行,需要依赖于硬件基础之上的操作系统和一个Java虚拟机.Tomcat的内存溢出本质就是JVM内存溢出,所以在本文开始时,应该先对Java JVM有关内存方面的知识 ...

  8. Java中OutOfMemoryError(内存溢出)的三种情况及解决办法

    Java中OutOfMemoryError(内存溢出)的三种情况及解决办法 相信有一定java开发经验的人或多或少都会遇到OutOfMemoryError的问题,这个问题曾困扰了我很长时间,随着解决各 ...

  9. java 内存溢出时打印_如何在JVM内存溢出的时候自动dump内存快照

    解决OOM问题的一个初步思路 首先第一个问题,假设发生OOM了,必然说明系统中某个区域的对象太多了,塞满了那个区域,而且一定是无法回收掉那些对象,最终才会导致内存溢出的. 既然是这个思路,要解决OOM ...

最新文章

  1. 邮件服务的安装及简单应用
  2. Linux 初步笔记
  3. Android应用开发—ViewPager FragmentPagerAdapter和FragmentStatePagerAdapter下Fragment的生命周期
  4. Java常用设计模式————抽象工厂模式
  5. serverless 构建_使用Serverless,StepFunction和StackStorm Exchange构建社区注册应用程序-第2集...
  6. AD在原理图中高亮网络的两种方法,altium designer 20
  7. opencv 梯度幅值_20、 OpenCV导数和梯度
  8. 爬虫python编程与cvi编程_编程小白如何写爬虫程序
  9. 实现Codeblock支持C99标准
  10. web前端笔试试题一(含答案)
  11. 小米10获取root权限_2020年小米红米Miflash新版刷机救砖恢复去除ROOT权限教程
  12. 从零开始的单片机学习(二)
  13. uC/OS信号量Pend和Post都会做些什么
  14. Markdown符号:整除、不整除、恰整除、不恰整除
  15. 微信小程序拼图游戏(有效果图)
  16. 手机2020 QQ 群文件下载存储路径
  17. 怎么在线压缩PDF文件?常见途径说明
  18. 树莓派3b+安装ubuntu 16.04+ROS kinetic过程详解及踩坑总结
  19. 第二代身份证与第三代身份证有区别吗?
  20. 自动化控制面试问题整理

热门文章

  1. 使用Python和OpenCV捕获鼠标事件,并裁剪图像
  2. 和12岁小同志搞创客开发:手撕代码,做一款节拍电子鼓
  3. linux mud 游戏,快刀幻想mud文字传奇-快刀幻想mud神器兑换码-快刀幻想mud下载v1.80-Linux公社...
  4. 【论文速读】RandLA-Net大规模点云的高效语义分割
  5. Udacity机器人软件工程师课程笔记(十一)-ROS-编写ROS节点
  6. 如何解决用谷歌浏览器调试代码接口请求的时候,跳转网页切换网页的时候,上一个页面的接口请求记录被清除消失的问题
  7. 利用sort对多字段排序
  8. 链表类型题目需要用到的头文件list.h
  9. 二叉树:最近的公共祖先 Lowest Common Ancestor of a Binary Tree
  10. Django-C002-深入模型,到底有多深