学习了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. 【code】flex_进度条样式

    近期打算吧硬盘中的资料记录在博客中,实用的就当是个分享,无用的就当是个备份,还望大家不要见怪. 一共4个文件: JinDuTiaoItem.mxml: <?xml version="1 ...

  2. Python开发【1.4数据类型】

    1.数字 数字数据类型用于存储数值. 他们是不可改变的数据类型,这意味着改变数字数据类型会分配一个新的对象. # 创建对象 var1 = 1 var2 = 2 # 删除对象 del var1 del ...

  3. Tomcat 6.x Perm区内存泄露问题

    Tomcat 6.x JSP文件最后改动时间大于当前系统时间导致Perm区内存泄露问题(java Memory pool CMS Perm Gen) 出现场景: 因为測试业务,须要模拟跨天測试,所以一 ...

  4. Oculus Rift DK2 驱动安装教程

    第一次安装oculus rift硬件驱动的教程: 1.   执行驱动的下载网址:https://developer.oculusvr.com/ 下载驱动首先须要拥有一个oculus的帐号.点击Regi ...

  5. gcc优化选项解析

    1 -fno-defer-pop 函数返回的时候,就立即将栈里面放置的该函数的参数pop出来.这样可以避免函数参数占用过多的栈空间. 2 -fforward-propagate ? 3 -ffp-co ...

  6. POJ 3100:Root of the Problem

    Root of the Problem Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12060   Accepted: 6 ...

  7. Linux Centos 下安装软件 三种方式

    1)一种是软件的源代码,您需要自己动手编译它.这种软件安装包通常是用gzip压缩过的tar包(后缀为.tar.gz). 2)另一种是软件的可执行程序,你只要安装它就可以了.这种软件安装包通常被是一个R ...

  8. hdoj--2186--悼念512汶川大地震遇难同胞——一定要记住我爱你(模拟水题)

     悼念512汶川大地震遇难同胞--一定要记住我爱你 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (J ...

  9. 如何在 ubuntu 12.04 上安装 skype(转载)

    转自:http://blog.51osos.com/linux/how-to-install-skype-in-ubuntu-12-04/ 添加Canonical Partner Repository ...

  10. 关于Java泛型的?和 T 的区别

    java中的?号指未知的类型:而T指具体类型 泛型问号(?)未知的类型就是可以指定当前问号(?)所代表的类,可以指定上限(extends)和下限(super) 泛型T指已经具体知道了类型,就是不能指定 ...