学习了java运行时数据区,知道每个内存区域保存什么数据,可以参考:https://www.cnblogs.com/huigelaile/p/diamondshine.html,然后了

解内存溢出和内存泄露是很有必要的,一方面是为了面试,更重要是的在工作中能够快速定位错误原因并且解决

内存溢出分类:

1、java.lang.OutOfMemoryError: Java Heap space

  通过后面的提示信息知道应该堆区发生内存溢出,几乎所有的对象都保存在堆区,所以只要不断的生成对象,并且保证其可达性,就可以达到

堆区的OOM,可以通过下面参数最大、最小堆空间控制堆的大小

/**
* -Xms20m -Xmx20m
*/
public class TestUnit { static class OOMObject { } public static void main(String[] args) {
List<OOMObject> list = new ArrayList<OOMObject>();
while (true) {
list.add(new OOMObject());
}
}
}

2、栈内存溢出(HotSpot只有栈,没有虚拟机栈和本地方法栈,可以通过-Xss设置,而-Xoss对应本地方法栈是无效的)

  关于栈,虚拟机规范中描述了两种异常:

  ①.如果线程请求的栈深度大于虚拟机所允许的最大深度,将抛出StackOverflowError异常

  ②.如果虚拟机在拓展栈时无法申请到足够的内存空间,则抛出OutofMemoryError异常

  但是单线程一般情况下只会抛出StackOverflowError异常,多线程环境下可以抛出OutofMemoryError异常。栈中保存着栈帧,可以通过递归,

不断生成栈帧,从而打成内存溢出

/**
* -Xss128k
*/
public class TestUnit { private int stackLength = 1;
public void stackLeak() {
stackLength++;
stackLeak();
} public static void main(String[] args) throws Throwable{
TestUnit test = new TestUnit();
try {
test.stackLeak();
} catch (Throwable e) {
System.out.println("stack Length:" + test.stackLength);
throw e;
}
}
}

3、java.lang.OutOfMemoryError: PermGen space

  通过名称可以知道和Permanent Generation Space相关,也就是永久代。这个异常在jsp进行预编译的时候有遇到过,或者大量引入第三方jar包

  一般情况就是增加方法区大小,例如XX:PermSize=256M -XX:MaxPermSize=512m。只有HotSpot通过永久代实现方法区,而在jdk1.8之后就放弃了

永久代,改有本地内存实现。

4、方法区内存溢出(jdk1.7之前的版本,因为常量池从方法区移到堆中,String.intern()发生变化)

/**
* -XX:PermSize=10M -XX:MaxPermSize=10M
*/
public class TestUnit { public static void main(String[] args) {
List<String> list = new ArrayList<>();
int i = 1;
while (true) {
list.add(String.valueOf(i++).intern());
}
}
}

5、java.lang.OutOfMemoryError:GC over head limit exceeded

  系统进行高频的GC,回收效果不佳,就会出现这个错误,个人没遇到过。

内存泄露:

  是指无用对象(不再使用的对象)持续占有内存或无用对象的内存得不到及时释放,从而造成的内存空间的浪费称为内存泄露。内存泄露有时

不严重且不易察觉,这样开发者就不知道存在内存泄露,但有时也会很严重,会提示你Out of memory。

static class OOMObject{

    }

    public static void main(String[] args) {
List<OOMObject> list = new ArrayList<OOMObject>();
while (true) {
OOMObject object = new OOMObject();
list.add(object);
object = null;
}
}

类似这样的代码,list还是保存着object的引用,object不会被回收的,可以把list设置为null解决

内存泄露可以参考这篇文章:https://www.ibm.com/developerworks/cn/java/l-JavaMemoryLeak/

java虚拟机(四)--内存溢出、内存泄漏、SOF的更多相关文章

  1. Java虚拟机解析篇之---内存模型

    今天闲来无事来,看一下Java中的内存模型和垃圾回收机制的原理.关于这个方面的知识,网上已经有非常多现成的资料能够供我们參考,可是知识还是比較杂的,在这部分知识点中有一本书不得不推荐:<深入理解 ...

  2. Java虚拟机垃圾收集器与内存分配策略

    Java虚拟机垃圾收集器与内存分配策略 概述 那些内存须要回收,什么时候回收.怎样回收是GC须要完毕的3件事情. 程序计数器.虚拟机栈与本地方法栈这三个区域都是线程私有的,内存的分配与回收都具有确定性 ...

  3. 【深入理解JAVA虚拟机】第二部分.内存自动管理机制.1.内存区域

    1.内存区域 根据<Java虚拟机规范(Java SE 7版)> 的规定,Java虚拟机所管理的内存将会包括以下几个运行时数据区域,如图所示.  程序计数器 当前线程所执行的字节码的行号指 ...

  4. 深入理解java虚拟机读书笔记1--java内存区域

    Java在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途.创建和销毁的时间,有一些是随虚拟机的启动而创建,随虚拟机的退出而销毁,有些则是与线程一一对应,随 ...

  5. 内存溢出,内存泄漏,CPU溢出区别

    内存溢出 out of memory,就是你要的内存空间超过了系统实际分配给你的空间,此时系统相当于没法满足你的需求,就会报内存溢出的错误 内存泄漏是指你向系统申请分配内存进行使用(new),可是使用 ...

  6. 《深入理解 Java 虚拟机》学习笔记 -- 内存区域

    <深入理解 Java 虚拟机>学习笔记 -- 内存区域 运行时数据区域 主要分为 6 部分: 程序计数器 虚拟机栈 本地方法栈 Java 堆 方法区 如图所示: 1. 程序计数器(线程私有 ...

  7. 转载: Java虚拟机:运行时内存数据区域、对象内存分配与访问

    转载:  https://blog.csdn.net/a745233700/article/details/80291694  (虽然大部分内容都其实是深入理解jvm虚拟机这本书里的,不过整理的很牛逼 ...

  8. 实战Java虚拟机之一“堆溢出处理”

    从今天开始,我会发5个关于java虚拟机的小系列: 实战Java虚拟机之一“堆溢出处理” 实战Java虚拟机之二“虚拟机的工作模式” 实战Java虚拟机之三“G1的新生代GC” 实战Java虚拟机之四 ...

  9. java虚拟机内存溢出和泄漏实例

    测试参数设置: 1.循环调用new A()实现堆溢出,java.lang.OutOfMemoryError: Java heap space, 虚拟机参数:-Xms1M -Xmx1M -XX:+Hea ...

随机推荐

  1. TCP/IP具体解释学习笔记——数据链路层(2)

    五 Wireless LANs(Wi-Fi) 现在很流行的一种接入互联网的方式就是Wi-Fi了.我们用的ipad.手机.笔记本电脑等等都能够用这样的方式接入互联网,很方便灵活.一个典型的Wi-Fi网络 ...

  2. 嵌入式开发之cmos---前端采集aptina cmos

    http://wenku.baidu.com/link?url=NFl5ye1-o5GNMVGmxBmot1v1HQBOZRA2xo7__sgxxLnpHqodpqtfIW_pf4QNGRX4u8n8 ...

  3. c# Winform上传文件

    http://blog.csdn.net/shihuan10430049/article/details/3734398这个代码有点问题 http://blogs.msdn.com/b/johan/a ...

  4. 【OI】Kruskal & ufs (克鲁斯卡与并查集)

    Kruskal是有关于最小生成树的算法. 这个算法非常好理解,用一句话来概括就是: 从小到大找不同集合的边. 那么,具体是怎样的呢. 1.先把所有顶点初始化为一个连通分量. 2.从所有边中选择最小的( ...

  5. Aaron Swartz Rewriting Reddit中关于web.py的创建思路

    这天才少年居然自杀了,哎 原文点这 So how should things work? The first principle is that code should be clear and si ...

  6. SemaphoreSlim

    https://msdn.microsoft.com/en-us/library/system.threading.semaphoreslim(v=vs.110).aspx Represents a ...

  7. ModuleNotFoundError: No module named 'PIL'

    错误:ModuleNotFoundError: No module named 'PIL' 解决办法: pip install Pillow

  8. 【148】DevExpress相关控件使用

    ---------------------------------------------------------------------------------------------------- ...

  9. Netty,Thrifty

    小白科普:Netty有什么用? https://mp.weixin.qq.com/s/PTKnRQ_hLf8BBPYnywLenA Thrifty 是基于.net Attribute 实现了标准 Th ...

  10. HTML5移动Web开发

    1. 响应式web设计 说到这个,移动开发面对的屏幕尺寸那叫一个丰富,其中安卓阵营就够让人头痛的.我们在PC端常用的两种布局方式就是固定布局和弹性布局,前者设置一个绝大多数电脑能正常显示的固定宽度居中 ...