文档章节

OutOfMemoryError异常 jdk1.8

我的最爱是那个人
 我的最爱是那个人
发布于 2016/07/01 12:28
字数 721
阅读 10
收藏 0

4.1java堆溢出

     java堆用于存储对象实例,只要不断的创建对象,并且保证GC Roots到对象之间有可达路径来避免垃圾回收机制清除这些对象,那么在对象数量达到最大堆的容量限制后就会产生内存溢出异常。

     设置不可自动扩展的堆内存空间,堆的最小值 -Xms参数与最大值-Xmx参数设置为一样即可避免堆自动扩展,通过设置 -XX:+HeapDumpOnOutOfMemoryError 可以让虚拟机在出现内存溢出异常时,Dump当前的内存堆转储快照以便事后分析。

     生成内存快照在linux上打开jmap -dump:format=b,file=快照文件名<pid>。

     分析此异常信息,分析是否由内存泄漏,可以对象到GC Roots的引用链,可以比较准确的定位出泄漏代码的位置。

     如果不是内存泄漏,就应该检查堆参数的设置。

 

4.2 虚拟机栈和本地方法栈

     在HotSopt中不区分虚拟机栈和本地方法栈,因此对于对于HotSpot来说,虽然-Xoss参数(设置本地方法栈大小)存在,但实际上是无效的,栈容量只由-Xss参数设定。对于虚拟机栈和本地方法栈,在java虚拟机规范中描述了两种异常:

     1.如果线程栈请求的栈的深度大于虚拟机所允许的最大深度,则抛出StackOverflowError异常,   jdk1.8时默认的栈空间是160k。

     

     2.当虚拟机在扩展栈时,无法申请到足够多的内存空间,则抛出OutOfMemoryError异常

 

4.3方法区和运行时常量池溢出

     StringBuilder创建的字符串实例在java堆上。

     第一种常量池溢出

     jdk1.6及以前的版本常量池分配在永久代内,我们可以通过-XX:PermSize 和-XX:MaxPermSize限制方法区大小。从而间接的限制其中常量池的容量。

1.6中测试:

运行结果中,常量池溢出,在OutOfMemoryError后面跟随的事“PerGen space”,说明运行时常量池属于方法区(HotSpot虚拟机中的永久代)的一部分。

          

这种配置在jdk1.7种不会出现这种错误,而是一直运行下去,在jdk1.8中,则提示,该配置在1.8中已经移除。

第二种方法区溢出

方法区主要存放的是Class的相关信息,如类名、访问修饰符、常量池、字段描述、方法描述等,所以,如果运行时产生大量的类去填充方法区,则方法区是会溢出的。

 

4.4 本机直接内存溢出

     DirectMemory 容量可以通过-XX:MacDirectMemorySize指定,如果没有指定,则默认与java堆的大小值(-Xmx指定)一样。真正申请本机分配内存的方法是unsafe.allocateMemory();

 

 

     

© 著作权归作者所有

我的最爱是那个人
粉丝 4
博文 45
码字总数 39769
作品 0
朝阳
程序员
私信 提问
Java 常见内存溢出异常与代码实现

Java 堆 OutOfMemoryError Java 堆是用来存储对象实例的, 因此如果我们不断地创建对象, 并且保证 GC Root 和创建的对象之间有可达路径以免对象被垃圾回收, 那么当创建的对象过多时, 会导致 ...

手掌大人
2016/10/23
143
1
JVM内存区域(基于jdk1.7)

一 程序计数器 程序计数器是一块较小的内存空间,可以看做当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里(仅仅是概念模型,各种虚拟机可能通过一些更加高效的方式实现),字节码解...

sen_ye
2018/07/13
0
0
JVM学习总结(一)运行时数据区

《深入Java虚拟机》这本书买了有一段时间了,当时看的时候就只是看,并没有边看边总结啥的,最后发现到脑子里面的根本所剩无几了。现在开始要好好归纳总结地再学习一遍。 运行时数据区域 JV...

hensemlee
2018/04/22
0
0
如何修复Java中的VirtualMachineError

即使是最好的代码也会抛出错误,对开发人员而言这意味着需要知道如何修复它们。在这篇文章中,Ram Lakshmanan 介绍了许多不同类型的 VirtualMachineError 以及如何解决这些问题,在应用程序不...

java菜分享
01/28
0
0
Java的OutOfMemoryError和StackOverflowError

Java的OutOfMemoryError和StackOverflowError Java Virtual Machine定义了两种异常:OutOfMemoryError与StackOverflowError。 OutOfMemoryError:Java启动一个线程时,JVM没有足够的内存空间...

开开心心过
2017/10/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

高并发场景下的缓存有哪些常见的问题?

一、缓存一致性问题 当数据时效性要求很高时,需要保证缓存中的数据与数据库中的保持一致,而且需要保证缓存节点和副本中的数据也保持一致,不能出现差异现象。 这就比较依赖缓存的过期和更新...

别打我会飞
43分钟前
3
0
List list = new ArrayList()为何父类引用指向子类对象(多态)

态:要有继承,方法的重写,父类引用指向子类对象 疑问一:父类引用指向子类对象 与指向父类对象 Animal cat = new Cat(); //向上转型。 父类引用指向子类对象,该引用不能再访问子类新增加的...

architect刘源源
44分钟前
3
0
分而治之-快速排序

快速排序的思想: 快速排序首先在数组中确定1个枢纽项(比如数组中的第一个元素),将大于该枢纽项的元素放到右侧,小于该枢纽项的元素放到左侧,这样枢纽项将数组划分成两部分。接着继续对划...

万山红遍
今天
5
0
Qt编写自定义控件9-导航按钮控件

前言 导航按钮控件,主要用于各种漂亮精美的导航条,我们经常在web中看到导航条都非常精美,都是html+css+js实现的,还自带动画过度效果,Qt提供的qss其实也是无敌的,支持基本上所有的CSS2属...

飞扬青云
今天
4
0
Python开发工具:pyJasper

原文:https://www.oschina.net/p/pyjasper 前言 pyJasper是 JasperReports 网络服务器的 Python 客户端。 pyJasper 是一组 Python 基础工具,可以用来处理 JasperReports 报表 。因为 Jasper...

A_裙232550246
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部