java程序员在面试经常被问到内存om之后如何处理,但是实际在工作中遇到此类问题的情况却又非常少。

进过自己一番总结内存溢出主要分为2种:

一、堆内存溢出 OutOfMemoryError

从jvm的角度看发生的情况是:

1、动态扩展的栈内存无法满足内存分配。

2、建立新的线程没有足够内存创建栈。

从编码角度看发生的情况是:

1、内存中加载的数据量过于庞大,如一次从数据库取出过多数据;

2、集合类中有对对象的引用,使用完后未清空,使得JVM不能回收;

3、代码中存在死循环或循环产生过多重复的对象实体;

4、使用的第三方软件中的BUG;

5、启动参数内存值设定的过小;

解决方案:

1、检查代码中是否存在一次性取出大量数据

2、检查循环体、递归调用中是否有大量导致gc无法回收的对象

3、-Xms -Xmx 配置最大最小堆内存大小,默认 -Xms256m -Xmx512m

示例:

/** * 堆内存溢出 */

private static void OutOfMemoryErrorExample() {

Listlist = new ArrayList<>();

String str = "";

while (true) {

str += new Date().toString();

list.add(str);

}

}

二、线程jvm栈内存溢出 StackOverflowError

从jvm的角度看发生的情况是:方法执行时申请不到新的空间存储(局部变量表, 操作数栈 , 动态链接 , 方法出口信息)。

从编码角度看发生的情况是: 一般出现在递归和循环依赖调用的代码块中

解决方案:

1、检查递归和循环依赖调用的代码块,尽可能严谨。

2、-Xss 通过这个参数配置默认的jvm栈大小,这个标识即可以通过项目的配置也可以通过命令行来指定,默认 -Xss1m 或者 -Xss0.5m。

示例:

/**

* 栈内存溢出

*/

private static void StackOverflowErrorExample(int index) {

if (index != 0) {

StackOverflowErrorExample(++index);

}

}

总结:

一般来说,方法在调用时发生的内存不足 会抛StackOverflowError ,发生在方法执行过程中的内存不足会抛 OutOfMemoryError

StackOverflowError(方法调用层次太深,内存不够新建栈帧)

OutOfMemoryError(线程太多,内存不够新建线程)

模拟内存溢出的时候可以设置jvm的启动参数,设置小点的内存量,让它尽快达到内存溢出的效果

如:  -Xmx64m -Xms32m -Xmn16m -Xss8m

一旦发生内存溢出可以进行一些应对措施,这个问题在下篇jvm内存监控中再说

欢迎关注我的个人公众号

java list 内存溢出_java内存溢出的2种情况相关推荐

  1. java 内存溢出 内存泄露_java 内存泄露、内存溢出、内存不足

    内存泄露 什么是内存泄露? 在维基百科上的定义如图: 中文意思就是一个对象在内存中,而程序无法获取此对象,于是不能释放该对象所占用的内存. 百度百科上的定义如图: OWASP上的定义: 开发者无法释放 ...

  2. java 如何排查内存溢出_java 内存溢出排查

    测试代码,如下示例: import java.util.ArrayList; import java.util.List; /** * @Description 测试内存溢出, 启动时设置参数,最大堆 ...

  3. java long 内存溢出_JAVA内存区域与内存溢出异常

    JAVA内存区域与内存溢出异常 一 Java内存区域 Java虚拟机在执行java程序的过程中会把它管理的内存划分为若干个不同的数据区域,Java虚拟机所管理的内存包含以下几个运行时数据区域. 1.程 ...

  4. docker java 内存溢出_java内存溢出

    与此问题类似jmeter Error occurred during initialization of VM Could not reserve enough space_萧木易的博客-CSDN博客 ...

  5. java数组内存溢出_Java内存溢出问题总结

    使用Java那么久,在此总结一下Java中常见的内存溢出问题以及对应的解决思路 堆溢出 报错信息 java.lang.OutOfMemoryError: Java heap space 报错原因 堆中 ...

  6. java 内存 溢出_java内存溢出的几种原因和解决办法是什么?

    java内存溢出的几种原因和解决办法是什么? java内存溢出的几种原因和解决办法是: 第一类内存溢出,也是大家认为最多,第一反应认为是的内存溢出,就是堆栈溢出: 那什么样的情况就是堆栈溢出呢?当你看 ...

  7. java什么时候可能产生内存溢出_JAVA内存泄露和内存溢出

    1)概念: 内存溢出:指在指定大小的内存空间,写入了超出大小的数据,从而导致了内存溢出. 内存溢出:指程序运行过程中无法申请到足够的内存而导致的一种错误. 内存溢出通常发生于OLD段或Perm段垃圾回 ...

  8. java 内存溢出和内存泄漏_JAVA内存泄漏和内存溢出的区别

    内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory:比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出. ...

  9. JAVA 继承内存模型_Java内存模型

    JVM的组成 类加载器(classloader) 执行引擎(execution engine) 运行时数据区域(runtime data area) 对于Java程序员来说,在虚拟机自动内存管理机制下 ...

最新文章

  1. 关于 并查集(union find) 算法基本原理 以及 其 在分布式图场景的应用
  2. VIM 使用技巧(常用提取)
  3. ORACLE同义词源库锁表导致目标库删除操作报ora 02055 02049 02063 06512
  4. GitKraken - 简单教程
  5. 如何显示python的内置模块_Python 如何查看Python自带的模块 - 弟球嗑学
  6. C语言typedef:给类型起一个别名
  7. python播放WAVE文件
  8. 分类与聚类及聚类算法分类
  9. linux下的chm阅读器?
  10. 广域网技术-PPP协议
  11. jadx在windows下的安装
  12. Multisim设置图纸大小的详细步骤
  13. Continous Integration.Continous Development,Continous Delivery之间的关系
  14. #书籍《量子力学》读后感
  15. 机器学习中特征选择概述
  16. apk闪退_安卓手机经常闪退怎么办?安卓手机闪退解决办法
  17. java 服务端验证苹果支付applepay账单
  18. Matplotlib实现单画布绘制多个子图
  19. LateX 全文(局部)字体大小设置
  20. 使用Matlab+Simulink开发Cortex-M系列嵌入式处理器应用程序

热门文章

  1. 程序员如何自我学习?
  2. 带你了解数据结构与算法。附leetcode练习题
  3. 超市管理系统(java+Mysql)
  4. java 高级程序员_如何才能成为java高级程序员?
  5. 抖音、B站互相偷艺?
  6. BBC教学人员谈如何增加英语词汇量
  7. 如何租用一台好用的奇迹MU服务器
  8. 钉钉注册阿里云账号全流程
  9. 妇女节 | 卓然而立,绽放光芒!
  10. C++基础编程题(06)求调和平均数(两个数,的倒数平均值的倒数)