我们提供安全,免费的手游软件下载!

安卓手机游戏下载_安卓手机软件下载_安卓手机应用免费下载-先锋下载

当前位置: 主页 > 软件教程 > 软件教程

Java内存溢出异常(OOM)的几种情况及解析

来源:网络 更新时间:2024-04-12 04:30:30

OOM是Out Of Memory的缩写,指的是内存溢出错误。在程序发生OOM时,要定位导致异常的代码是相当困难的,尤其是需要检查OOM发生的原因,了解各种OOM情况下可能出现的异常信息,并结合异常堆栈、heapDump文件、JVM分析工具和业务代码来判断具体是哪些代码导致的OOM。本文将测试并记录以下几种OOM情况。

环境准备

  • jdk1.8(HotSpot虚拟机)
  • Windows操作系统
  • Idea开发工具

在Idea上进行测试时,需要了解如何设置虚拟机参数(VM options)。

  1. 单击main方法的启动图标,选择修改运行配置

  2. 打开Add VM options,将JVM参数填在图示VM options处

堆溢出

Java堆是用来存储对象实例的,当不断创建对象并且保证对象不被GC回收时,当对象占用的内存达到了最大堆内存限制,无法再申请到新的内存空间时,就会导致OOM。在代码中,可以通过设置参数-XX:+HeapDumpOnOutOfMemoryError来打印OOM发生时的堆内存状态。执行结果如下:

字符串常量池溢出

通过String.intern()方法将字符串添加到常量池中。代码如下:

栈溢出

在JVM规范中,栈有虚拟机栈和本地方法栈之分。但在实际的实现中,HotSpot虚拟机是没有区分虚拟机栈和本地方法栈的。所以对于HotSpot来说,-Xoss(设置本地方法栈大小)参数是无效的,栈容量只能通过-Xss参数设置。测试代码如下:

方法区溢出

方法区存放的是类的信息,所以在运行时不断创建类就行。代码如下:

本机直接内存溢出

通过-XX:MaxDirectMemorySize=10M参数设置能申请的DirectMemory大小。测试代码如下: