Java虚拟机系列(三)---内存溢出情况及解决方法
因为Java虚拟机内存有堆内存、方法区、虚拟机栈、本地方法栈和程序计数器五部分组成,其中程序计数器是唯一一块不会发生内存溢出异常的内存区,所以只有四类内存区可能发生内存溢出异常,其中虚拟机栈和本地方法栈都是Java方法执行的内存模型,所以它们的异常发生情况几乎相同,另外,在方法区中。又有一块内存是常量池,所以内存溢出的情况可分为Java堆溢出、虚拟机栈和本地方法栈溢出、方法区和运行时常量池溢三种情况。
一、Java堆溢出
1、产生的原因:因为堆中存放的是对象实例和数组,所以当对象数量>最大堆容量限制时,就会发生内存溢出异常;
2、解决方案:
1)如果对象不是必须的,但是又有指向GC Root(后面章节介绍)的引用链,此时无法被GC,就会出现内存泄露,可通过定位泄露原因在代码中找到解决方案;
2)如果对象是必须的,就要检查虚拟机栈的堆参数能否调大(当虚拟机内存总容量小于物理内存时可以调大),如果能调大可通过修改该参数来解决:
--Xmx:最大堆内存
--Xms:最小堆内存
如果--Xmx和--Xms相同,则说明堆内存不可动态扩展。
二、虚拟机栈和本地方法栈溢出
1、发生内存溢出的原因:
由于在HotSpot虚拟机中,不区分虚拟机栈和本地方法栈,所以设置本地方法栈大小的参数--Xoss无效,一般通过--Xss参数设置栈容量(我猜测ss是stack size的缩写,这样比较好记)
虚拟机中定义了两种异常情况:
1)当线程申请的栈深度超过虚拟机允许的最大栈深度时,会发生StackOverflowError异常;
2)当栈内存扩展时,如果不能申请到足够的内存,就会发生OutOfMemoryError异常
我们知道这部分内存是线程私有的,每个线程都需要分配一块内存,所以当线程很多时就会发生内存溢出,下面来分析一下这句话背后的原理:
①内存容量=堆内存+方法区内存+程序计数器内存(可忽略)+栈内存(虚拟机栈和本地方法栈);
②因为栈容量在编译器就可知,且一旦分配在运行期就不会改变,在栈容量一定的情况下,每个虚拟机栈分配到的栈容量越大,可以创建的线程数就越少;
③当线程过多时,就会导致栈容量不足,从而发生内存溢出;
2、解决方法:
首先,判断能不能减少线程数,如果能则减少线程数;如果不能减少线程数,就只能通过减小最大堆内存容量和最大栈容量来解决:
1)--Xmx:减少
2)--Xss:减少
三、方法区和运行时常量池溢出
1、异常发生原因
方法区主要存储class的相关信息,如类,名、访问修饰符、常量池、字段描述信息、方法描述信息等,所以如果运行时产生大量的类去填满方法区,就能出现内存溢出异常。这里就涉及到如何动态产生大量类的方法,一般有如下两种:
1)使用反射机制或动态代理
2)使用CGLib直接操作字节码
2、解决方法:
通过调节方法区大小参数--XX:PermSize和-XX:MaxPermSize限制方法区大小,当设置成相同的值时不可扩展。
除以上三种虚拟机内存溢出情况之外,还有一种本机直接内存溢出,可通过调节参数-XX:MaxDirectMemorysize指定,若不指定,则和Java堆内存大小一样。
以上就是Java虚拟机中的几种内存溢出情况及解决方法。
Java虚拟机系列(三)---内存溢出情况及解决方法的更多相关文章
- java中三种常见内存溢出错误的处理方法
更多 10 相信有一定java开发经验的人或多或少都会遇到OutOfMemoryError的问题,这个问题曾困扰了我很长时间,随着解决各类问题经验的积累以及对问题根源的探索,终于有了一个比较深入的 ...
- java中三种常见内存溢出错误的处理方法(good)
相信有一定java开发经验的人或多或少都会遇到OutOfMemoryError的问题,这个问题曾困扰了我很长时间,随着解决各类问题经验的积累以及对问题根源的探索,终于有了一个比较深入的认识. 在解决j ...
- Java虚拟机4:内存溢出
堆溢出 Java堆唯一的作用就是存储对象实例,只要保证不断创建对象并且对象不被回收,那么对象数量达到最大堆容量限制后就会产生内存溢出异常了.所以测试的时候把堆的大小固定住并且让堆不可扩展即可.测试代码 ...
- Java虚拟机3:内存溢出
1.前言 上一篇我们介绍了java的内存区域结构,这一篇,模拟内存溢出的几个场景,下面一个图是总体的指导思想: 2.Java堆溢出 Java堆唯一的作用就是存储对象实例,只要保证不断创建对象并且对象不 ...
- Java虚拟机6:内存溢出和内存泄露、并行和并发、Minor GC和Full GC、Client模式和Server模式的区别
前言 之前的文章尤其是讲解GC的时候提到了很多的概念,比如内存溢出和内存泄露.并行与并发.Client模式和Server模式.Minor GC和Full GC,本文详细讲解下这些概念的区别. 内存溢出 ...
- Tomcat常见的内存溢出,以及解决方法
一.常见的三种内存溢出错误: 1.java.lang.OutOfMemoryError:java heap space ====JVM Heap(堆)溢出 JVM再启动的时候回自动设置JVM H ...
- jmeter(二十二)内存溢出原因及解决方法
jmeter是一个java开发的开源性能测试工具,在性能测试中可支持模拟并发压测,但有时候当模拟并发请求较大或者脚本运行时间较长时,压力机会出现卡顿甚至报异常————内存溢出, 这里就介绍下如何解决内 ...
- <转>jmeter(二十二)内存溢出原因及解决方法
本博客转载自:http://www.cnblogs.com/imyalost/category/846346.html 个人感觉不错,对jmeter讲解非常详细,担心以后找不到了,所以转发出来,留着慢 ...
- jmeter 内存溢出原因及解决方法
jmeter是一个java开发的开源性能测试工具,在性能测试中可支持模拟并发压测,但有时候当模拟并发请求较大或者脚本运行时间较长时,压力机会出现卡顿甚至报异常————内存溢出, 这里就介绍下如何解决内 ...
随机推荐
- Parse:App开发必备 让应用开发效率提高上百倍
Parse一个应用开发工具, 是由Y Combinator所孵化的创业公司.使用Parse能把效率提高10倍到100倍.通常情况下,从开发用户到推广用户需要花几周时间,用了Parse则只需几小时.[U ...
- 转:Linux环境下段错误的产生原因及调试方法小结
源地址:http://www.cnblogs.com/panfeng412/archive/2011/11/06/2237857.html 补充:http://baike.baidu.com/link ...
- 左神算法进阶班1_5BFPRT算法
在无序数组中找到第k大的数1)分组,每N个数一组,(一般5个一组)2)每组分别进行排序,组间不排序3)将每个组的中位数拿出来,若偶数,则拿上 / 下中位数, 成立一个一个新数组.4)新数组递归调用BF ...
- Linux-c对一个十六进制数的某一位取反
enum SWITCH_FLAG { SWITCH_ALL_FLAG = , SWITCH_WEB_FLAG = , …… } unsigned int switch_by_bit_value = 0 ...
- 16进制与utf-8
很多人将数据的存储.传输方式和展现形式混为一谈. 类似的16进制 2进制是讲内容在电脑里面的存储或者传输的一种格式, 而utf-8 gb2312 等是输出的展现的一种格式 不是一回事,另外 gbk包含 ...
- android 使用现成做get请求
//接受子线程发来的消息 Handler hanler = new Handler() { @Override public void handleMessage(Message msg) { // ...
- npm淘宝镜像配置
npm config set registry https://registry.npm.taobao.org
- ODOO/OPENERP的网页模块QWEB简述
1.web 模块 注意,OpenERP 模块中 web 部分用到的所有文件必须被放置在模块内的 static 文件夹里.这是强制性的,出于安全考虑. 事实上,我们创建的文件夹 CSS,JS 和 XML ...
- 18多校8th
a-容斥原理(带限制的不定方程) #include<bits/stdc++.h> using namespace std; #define mod 998244353 #define ll ...
- QQ交流群