虚拟机系列:内存溢出OOM以及解决思路

内存溢出是编程中的常见问题,特别是在Java中。本文详细探讨了四种类型的Java内存溢出:堆溢出、直接内存溢出、线程过多导致的OOM以及永久代/元空间溢出。针对每种情况,文章提供了原因分析和相应的解决方法,包括检查代码、调整启动参数、优化内存使用和考虑使用工具进行内存分析等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

内存溢出(OutOfMemoryError,简称OOM)是让程序员头疼的问题,出现这种问题一般是内存空间要被用完了,没有足够的空间供程序使用。而在Java程序中,出现内存溢出的原因也有很多,常见的有堆内存溢出,直接内存溢出,永久区/元空间溢出。

堆溢出

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
复制代码

堆溢出这种是最常见的一种,在Java中堆是重要的一个空间,Java的大量对象都是直接在堆上分配的(参考内存分配)。当大量对象占据了堆空间而且都是强引用,使之始终无法被回收,当所有对象大小之和大于参数-Xmx指定的值时,就会出现溢出了。

导致溢出的原因可能有很多,这里列举下常见的原因:

  • 服务工程中的代码类太多,堆空间不够用,可能在启动的时候就会出现堆溢出的错误。
  • 代码中存在循环或者死循环,产生过多的实体对象。
  • 数据库查询的时候一次查询大量数据。
  • 服务启动的参数-Xmx设置过小,也就是第一点。

例如我们不断往ArrayList中加入对象且无法回收导致出现堆溢出

/**
* 启动参数限制最大堆和最小堆:-Xms10m -Xmx10m
*/
public class Test2 {
    public static void main(String[] args) {
        ArrayList<byte[]> list = new ArrayList<>();
        for (int i=0;i<10;i++){
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

倾听铃的声

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值