一、有哪些内存溢出异常?

OutOfMemoryError:

当堆、栈(多线程场景)、方法区(永久区)、本地内存(元数据、直接内存),数据容量达到最大时产生

StackOverFlowError:

线程请求的栈深度大于虚拟机栈允许的最大深度(默认1MB)时产生

二、堆溢出产生原因及解决方法?

产生原因:

不停的创建对象或对象占用空间特别大,在对象数量达到堆最大容量时产生OutOfMemoryError

解决方法:

使用-XX:+HeapDumpOnOutOfMemoryError,可以让java虚拟机在出现内存溢出时,产生当前堆内存快照以便进行异常分析,主要分析哪些对象占用了内存

代码示例:

 import java.util.ArrayList;
import java.util.List; /**
* 描 述:堆内存溢出
* 作 者:潇邦
*/
public class HeapOOM { public static void main(String[] args) {
int i = 0;
List<String> list = new ArrayList<>();
while (true) {
list.add("abc");
i++;
}
} }

三、栈溢出产生原因及解决方法?

产生原因:

线程请求的栈深度大于虚拟机允许的最大深度,将抛出StockOverFlowError

多线程环境虚拟机栈在扩展时无法申请到足够内存空间,将抛出OutOfMemoryError

解决方法:

StockOverFlowError:一般函数层级过多导致,如死循环、死递归

OutOfMemoryError:一般多线程环境产生才会产生,一般用减少内存的方法,即减少栈容量来换取更多线程。

该参数可以设置栈容量(-XX:ThreadStackSize=512)

单线程栈代码示例:

 /**
* 描 述:栈内存溢出StackOverflowError
* 作 者:潇邦
*/
public class StackOverFlow {
private int var; public void run() {
var++;
run();
} public static void main(String[] args) {
StackOverFlow stackOverFlow = new StackOverFlow();
try {
stackOverFlow.run();
} catch (Exception e) {
System.out.println("Exception-栈深度:" + stackOverFlow.var);
e.printStackTrace();
} catch (Error e) {
System.out.println("Error-栈深度:" + stackOverFlow.var);
e.printStackTrace();
}
}
}

多线程栈代码示例:

 /**
* 描 述:多线程环境栈引发OutOfMemoryError
* 作 者:潇邦
*/
public class StackOom { public void call() {
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
} public void stackLeakByThread() {
while (true) {
new Thread(new Runnable() {
public void run() {
call();
}
}).start();
}
} public static void main(String[] args) {
StackOom soed = new StackOom();
soed.stackLeakByThread();
}
}

 

java内存溢出(二)的更多相关文章

  1. java内存溢出分析(二)

    我们继续java内存溢出分析(一)的分析,点击Details>按钮,显示如下图,我们发现有一个对象数量达到280370216个,再点击其中的List objects 点击后,显示下图 至此,我们 ...

  2. Java 内存溢出(java.lang.OutOfMemoryError)的常见情况和处理方式总结

    最近老是遇见服务器内存溢出的问题,故在网上搜了搜,总结了一些java内存溢出的解决方式 java.lang.OutOfMemoryError这个错误我相信大部分开发人员都有遇到过,产生该错误的原因大都 ...

  3. Java内存溢出详解

    转自:http://elf8848.iteye.com/blog/378805 一.常见的Java内存溢出有以下三种: 1. java.lang.OutOfMemoryError: Java heap ...

  4. Java内存溢出的详细解决方案

    本文介绍了Java内存溢出的详细解决方案.本文总结内存溢出主要有两种情况,而JVM经常调用垃圾回收器解决内存堆不足的问题,但是有时仍会有内存不足的错误.作者分析了JVM内存区域组成及JVM设置虚拟内存 ...

  5. java内存溢出的解决思路

    原文地址:https://www.cnblogs.com/200911/p/3965108.html 内存溢出是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于虚拟机能 ...

  6. java内存溢出怎么解决

    java.lang.OutOfMemoryError这个错误我相信大部分开发人员都有遇到过,产生该错误的原因大都出于以下原因:JVM内存过小.程序不严密,产生了过多的垃圾. 导致OutOfMemory ...

  7. [转]Java 内存溢出(java.lang.OutOfMemoryError)的常见情况和处理方式总结

    原文地址: http://outofmemory.cn/c/java-outOfMemoryError java.lang.OutOfMemoryError这个错误我相信大部分开发人员都有遇到过,产生 ...

  8. [转]Java内存溢出详解及解决方案

    原文地址:http://blog.csdn.net/xianmiao2009/article/details/49254391 内存溢出与数据库锁表的问题,可以说是开发人员的噩梦,一般的程序异常,总是 ...

  9. Java基础学习总结(30)——Java 内存溢出问题总结

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

  10. Java 内存溢出分析

    原文地址:Java 内存溢出分析 博客地址:http://www.moonxy.com 一.前言 Java 的 JVM 的内存一般可分为 3 个区:堆(heap).栈(stack)和方法区(metho ...

随机推荐

  1. 【一天一道LeetCode】#117. Populating Next Right Pointers in Each Node II

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Follow ...

  2. Android性能优化之常见的内存泄漏

    前言 对于内存泄漏,我想大家在开发中肯定都遇到过,只不过内存泄漏对我们来说并不是可见的,因为它是在堆中活动,而要想检测程序中是否有内存泄漏的产生,通常我们可以借助LeakCanary.MAT等工具来检 ...

  3. JS中回调函数的写法

    <!DOCTYPE HTML> <html><head>  <meta charset="GBK" /><title>回 ...

  4. MySQL进阶(一)主外键讲解

    1.什么是外键: 作为外键的字段. REFERENCES:映射到主表的字段2. ON DELETE后面的四个参数:代表的是当删除主表的记录时,所做的约定. RESTRICT(限制):如果你想删除的那个 ...

  5. Linux的启动流程(一)

    · 启动第一步--加载BIOS 当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的重要,以至于计算机必须在最开始就找到它.这是因为BIOS中包含了CPU的相关信息.设备启动顺序信息 ...

  6. foreach 内嵌的使用

    foreach内部处理数据流的每条记录,进行关系操作,最后用generate返回数据给外部.但注意关系操作符不能作用于表达式,要将表达式提取成关系. foreach内部只支持distinct, fil ...

  7. 05_学生管理系统,xml读写,布局的综合应用

     最终要做的项目目标: 2.编写Android清单文件AndroidManifest.xml <?xml version="1.0" encoding="utf ...

  8. Coco2dx制作一个3D旋转的效果

    建了工程之后修改HelloWorldScene.cpp文件,修改部分为 // on "init" you need to initialize your instance bool ...

  9. OpenCV导向滤波(引导滤波)实现(Guided Filter)代码,以及使用颜色先验算法去雾

    论文下载地址:http://research.microsoft.com/en-us/um/people/jiansun/papers/GuidedFilter_ECCV10.pdf 本文主要介绍导向 ...

  10. mysql进阶(十九)SQL语句如何精准查找某一时间段的数据

    SQL语句如何精准查找某一时间段的数据 在项目开发过程中,自己需要查询出一定时间段内的交易.故需要在sql查询语句中加入日期时间要素,sql语句如何实现? SELECT * FROM lmapp.lm ...