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开发的开源性能测试工具,在性能测试中可支持模拟并发压测,但有时候当模拟并发请求较大或者脚本运行时间较长时,压力机会出现卡顿甚至报异常————内存溢出, 这里就介绍下如何解决内 ...
随机推荐
- Spring基础面试题(一)
Spring是什么? Spring是一个轻量级的IoC和AOP容器框架.是为Java应用程序提供基础性服务的一套框架,目的是用于简化企业应用程序的开发,它使得开发者只需要关心业务需求.常见的配置方式有 ...
- yolo自己的数据集中LabelImg的安装出现No module named 'libs.resources'错误
以下是完整的安装过程,如果出现No module named 'libs.resources',直接看第四点. 1.安装PyQt,在官网下载吧,否则pip install 要等好久 2.安装PyQtT ...
- day 60 Django基础七之Ajax
Django基础七之Ajax 本节目录 一 Ajax简介 二 Ajax使用 三 Ajax请求设置csrf_token 四 关于json 五 补充一个SweetAlert插件(了解) 六 同源策 ...
- 非常棒的java在线编译平台
1.godingground https://www.tutorialspoint.com/compile_java_online.php 2.ideone.com 3.jdoodle在线Java编译 ...
- 高性能代理缓存服务器—Squid
Squid是什么? Squid是一款比较知名的开源代理缓存软件,它不仅可以跑在linux上还可以跑在windows以及Unix上,它的技术已经非常成熟.目前使用Squid的用户也是十分广泛的. Squ ...
- view架构
一 Django的视图函数view 一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应. 响应可以是一张网页的HTML内容,一个重定向,一个404错 ...
- 提问(prompt 消息对话框)用于询问一些需要与用户交互的信息。弹出消息对话框(包含一个确定按钮、取消按钮与一个文本输入框)
提问(prompt 消息对话框) prompt弹出消息对话框,通常用于询问一些需要与用户交互的信息.弹出消息对话框(包含一个确定按钮.取消按钮与一个文本输入框). 语法: prompt(str1, s ...
- [模拟退火][UVA10228] A Star not a Tree?
好的,在h^ovny的安利下做了此题 模拟退火中的大水题,想当年联赛的时候都差点打了退火,正解貌似是三分套三分,我记得上一道三分套三分的题我就是退火水过去的... 貌似B班在讲退火这个大玄学... 这 ...
- Dash Speed【好题,分治,并查集按秩合并】
Dash Speed Online Judge:NOIP2016十联测,Claris#2 T3 Label:好题,分治,并查集按秩合并,LCA 题目描述 比特山是比特镇的飙车圣地.在比特山上一共有 n ...
- Android开发 MediaRecorder使用Camera2配合录制视频(暂时有异常抛出,无法使用)
前言 这个博客本来是用来详细介绍MediaRecorder与Camera2,但是出乎预料之外,在获取mMediaRecorder.getSurface();的时候无论如何都是报错的,报错为Surfac ...