内存溢出的异常有很多,并且每种内存溢出都会有不同的异常信息和解决方式,下面会列出常见的几种内存溢出异常

堆内存溢出

java.lang.outofmemoryerror: java heap space

原因:

  • 当堆内存不足,并且已经达到jvm设置的最大值,无法继续申请新的内存,存活的对象在堆内存中无法被回收,那么就会抛出该异常,表示堆内存溢出。
  • 当一次从数据库查询大量数据,堆内存没有足够的内存可以存放大量的数据
  • 大量的强引用对象在堆内存中存活,gc无法回收这些对象,新创建的对象在新生代无法进行分配,full gc仍然无法进行回收

解决方案:

  • 查看当前jvm的堆内存配置是否太小,可以考虑增加堆内存大小

java_opts=”-server -xms1024m -xmx1024m”

表示将堆内存的初始值和最大值都设置为1024m

-xms设置堆内存的初始值

-xmx设置堆内存的最大值

-xms和-xmx最好设置相同的内存大小,可以防止因为jvm频繁进行内存的调整影响稳定性和使用

  • 查看代码中是否有从数据库中一次加载大量数据的情况,或者代码中有大量强引用无法进行回收

通过jvm参数:-xx:+heapdumponoutofmemoryerror可以让虚拟机在出现内存溢出的时候dump出当前的堆内存快照,便于保留快照分析

栈内存溢出

java.lang.outofmemoryerror:stackoverflow error

原因:

  • 线程请求的栈深度大于虚拟机允许的最大深度,抛出stackoverflowerror
  • 虚拟机在扩展栈时无法申请到足够的内存空间,抛出outofmemoryerror

解决方案:

  • 检查代码是否出现深度递归的情况,或者递归的终止条件没有设置
  • 如果是线程的栈内存空间过小,则通过-xss设置每个线程的栈内存空间

默认的-xss参数的大小应该是1m

栈内存是线程私有的,如果需要创建更多的线程,那么就需要将每个线程的栈内存空间减小,通过-xss参数设置每个线程的栈内存空间

配置参数: java_opts=”-server -xms1024m -xmx1024m -xss128k”

jdk8如果没有配置-xss默认大小为512k

-xss 设置每个线程的堆栈大小,一般默认512~1024kb,和jdk版本有关

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

java.lang.outofmemoryerror: permgen space

原因:

  • 方法区存放的是class的相关信息,如类名、访问修饰符、常量池、字段描述、方法描述等,内存溢出的原因可能是加载的类过多导致方法区没有足够的内存
  • 如果程序中大量使用cglib或者动态代理等对目标类进行代理,那么在运行时会生成大量的代理类,如spring、hibernate等框架。所以生成的代理类过多导致方法区没有足够的内存

解决方案:

  • 减少没有必要的class加载,防止方法区内存溢出并且减少程序的编译时间
  • 通过jvm参数设置方法区的大小,-xx:permsize和-xx:maxpermsize设置方法区的大小

运行时常量池是方法区的一部分,所以增加方法区的内存大小,相当于间接的增加了运行时常量池的内存大小

本机直接内存溢出

direct buffer memory

java 允许应用程序通过 directbytebuffer 直接访问堆外内存,许多高性能程序通过 directbytebuffer 结合内存映射文件(memory mapped file)实现高速 io

原因:

directbytebuffer 的默认大小为 64 mb,一旦使用超出限制,就会抛出 direct buffer memory 错误。使用nio则可能会出现该异常

解决方案:

directmemory的内存大小可以通过-xx:maxdirectmemorysize指定,如果没有设置,则默认和java堆最大值(-xmx)一样

元空间内存溢出

metaspace

jdk8 之后使用元空间(metaspace)代替永久代,元空间和永久代最大的区别是元空间的内存使用的是本地内存,而永久代使用的是jvm的内存

永久代、元空间都是方法区的实现,方法区是规范

原因:

元空间中存储的是类信息、常量池、方法描述等信息,直接使用本地内存,当本地内存不足的时候,会抛出outofmemoryerror:metaspace异常

解决方案:

虽然元空间的内存不是由jvm控制,不过可以通过jvm参数来设置分配的内存空间的大小-xx:maxmetaspacesize配置参数

以上就是java 常见的几种内存溢出异常及解决的详细内容,更多关于java 内存溢出的资料请关注www.887551.com其它相关文章!