学习了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. 告诉大家我是如何在14:00秒杀到 《深入理解Bootstrap》

    1.打开火狐,不用IE,3个评论窗口,层叠在一起,可以点击3次哦. 2.打开一个百度的现在时间,不能看你本机的时间,要互联网的时间. 3.等时间到13:59:59,开始依次点击按钮,总有你预想不到的结 ...

  2. Codeforces Beta Round #96 (Div. 1) C. Logo Turtle DP

    C. Logo Turtle   A lot of people associate Logo programming language with turtle graphics. In this c ...

  3. Bootstrap popover源码分析

    /* ======================================================================== * Bootstrap: popover.js ...

  4. A Go library implementing an FST (finite state transducer)——mark下

    https://github.com/couchbaselabs/vellum Building an FST To build an FST, create a new builder using ...

  5. POJ 3734 Blocks 矩阵递推

    POJ3734 比较简单的递推题目,只需要记录当前两种颜色均为偶数, 只有一种颜色为偶数 两种颜色都为奇数 三个数量即可,递推方程相信大家可以导出. 最后来个快速幂加速即可. #include< ...

  6. JavaScript 解析读取XML文档 实例代码(转)

    JavaScript解析读取XML文件,主要就是加载并解析XML文件,然后就可以测试解析的XML文件的内容,打印输出来. 在线演示:http://demo.jb51.net/js/2012/readx ...

  7. angularJs模版注入的两种方式

    一,声名式注入 1:app.js: var myApp = angular.module("myApp",["ngRoute"]); 2:controller. ...

  8. SVN请求认证信息

    WIN10:C:\Users\Home目录\AppData\Roaming\Subversion Window Server 系统:C:\Users\Home目录\AppData\Roaming\Su ...

  9. (博弈论)51NOD 1072 威佐夫游戏

    有2堆石子.A B两个人轮流拿,A先拿.每次可以从一堆中取任意个或从2堆中取相同数量的石子,但不可不取.拿到最后1颗石子的人获胜.假设A B都非常聪明,拿石子的过程中不会出现失误.给出2堆石子的数量, ...

  10. 虚拟机安装cenos7后ifcfg看网卡无inet地址掩码等信息

    在虚拟机安装centos7,进入系统使用ifconfig命令时,只有lo网卡( 127.0.0.1的ip地址)和eno16777736网卡,而且此网卡没有inet地址.掩码等信息. 这时候查看/etc ...